superb_fsj 发表于 2021-3-29 23:09

js问题

                        function foo() {
                                this.a = 100;
                                this.b = 200;
                        }
                       function goo() {
                                this.c = 300;
                                this.d = 400;
                        }
                        var seed = new foo(); //1
                        foo.prototype.fuss = function(fn) {
                                fn.prototype = seed;
                                seed = new fn; //2
                                return this; //3
                        }
                        var a = seed.fuss(goo);
                       
                        console.log(a.c);
                        console.log(a === seed);
                        console.log(seed.a);
能解释一下输出结果的原因吗,没看懂,想了很久就是不知道输出结果

hu_sa 发表于 2021-3-30 00:36

本帖最后由 hu_sa 于 2021-3-30 00:46 编辑

很有意思的题目,个人理解,欢迎指正讨论:
    function foo() {
      this.a = 100;
      this.b = 200;
    }
    function goo() {
      this.c = 300;
      this.d = 400;
    }
    var seed = new foo();
    //1
    foo.prototype.fuss = function(fn) {
      fn.prototype = seed;//prototype 很特殊,特殊到需要仔细研究,结合下面的参数,这里可以理解为直接prototype赋值为上面定义的对象seed,有些说这样的赋值无效,但是就是奇怪的可以
      seed = new fn; //seed 为new goo(),也就是{c: 300,d: 400, prototype: foo:{a: 100,b: 200}
               
      //2
      return this; //这里是重点,实际返回的原型对象,而不是seed实例,可以理解为就是继承的对象,一个隐藏的~哎,底层也不是很懂。。。
                //原型对象内部也有一个指针(constructor属性)指向构造函数:foo.prototype.constructor = foo;
      //3
    }
      
    var a = seed.fuss(goo);


    console.log(a.c); //undefined
    console.log(a === seed); //false
    console.log(seed.a); //100

把16行中返回seed,哈哈就是true咯,很值得深入研究的题目。

superb_fsj 发表于 2021-3-30 08:56

hu_sa 发表于 2021-3-30 00:36
很有意思的题目,个人理解,欢迎指正讨论:
    function foo() {
      this. ...

seed.__proto__ === a
是不是这样输出的就是true

hu_sa 发表于 2021-3-30 09:04

superb_fsj 发表于 2021-3-30 08:56
seed.__proto__ === a
是不是这样输出的就是true

是的,你还是很厉害的哈!

superb_fsj 发表于 2021-3-30 09:27

hu_sa 发表于 2021-3-30 09:04
是的,你还是很厉害的哈!

没,我就是个菜鸡,这题想了很久,昨天把内存图画了之后才懂了原型链,但是不懂为啥this返回的是原来的seed

superb_fsj 发表于 2021-3-30 09:40

hu_sa 发表于 2021-3-30 09:04
是的,你还是很厉害的哈!

我好像懂了var a = seed.fuss(goo),这时候this指向的是seed但这个seed是原来的seed执行到seed = new fn;的时候seed才变成了goo的实例对象所有a===seed是false。 是这样理解吗

Rezalt 发表于 2021-3-31 11:12

原型链了解一下
页: [1]
查看完整版本: js问题