吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1131|回复: 6
收起左侧

[求助] js问题

[复制链接]
superb_fsj 发表于 2021-3-29 23:09
                        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 编辑

很有意思的题目,个人理解,欢迎指正讨论:
[Java] 纯文本查看 复制代码
    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
很有意思的题目,个人理解,欢迎指正讨论:
[mw_shl_code=java,true]    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
原型链了解一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 04:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表