
1 switch Jul 11, 2013 可以查看 ECMAScript 5,面定了 typeof 是如果返回值的。 |
2 guchengf Jul 11, 2013 |
3 pythonee OP @guchengf 有点乱了,实例的constructor也可以乱改,但是instanceof却是用最初创建它的来判断真假,这里谁记录最初创建它的构造器的呢?这样的话 instance.constructor也未必等于instance.__proto__.constructor,不过如果你不改的话,两者却是相等的,文档第一句话也确实这么说 Returns a reference to the Object function that created the instance's prototype. |
4 otakustay Jul 11, 2013 一个函数建立的时候,就有.prototype.constructor指向函数本身 你改了prototype,新的prototype上没有constructor,因此f2.constructor在f2上没有,在Foo.prototype上也没有,就会再向上找Object.prototype上,在好运边能找到,因此就是Object这个东西 |
5 pythonee OP @otakustay 你说的原因和我想的一样,但是结果却不一样,函数建立的时候 确实是 function == function.prototype.constructor,而这时候由这个function创建的instance有以下关系 instance.cOnstructor== instance.__proto__.constructor 又有 instance.__proto__ == function.prototype 所以 instance.cOnstructor== function.prototype.constructor 如果我修改function.prototype,比如上面的f2,即Foo.prototype = {};所以 f2.cOnstructor= {}.constructor, 而{}.cOnstructor== Object.prototype.constructor,也即是Object(){ [native code]} 而这后面的结果你的顺藤摸瓜式想法不一样啊 |
6 otakustay Jul 12, 2013 @pythonee 我们的结果是一样的啊,最后都是追溯到Object.prototype.constructor,即Object本身,Object本身就是Object() { [native code] } 原型链的查找用一句话概括,就是“自己没有找自己原型,原型没有找原型的原型”,因此过程是 f2.constructor(没有) -> f2.__proto__(就是Foo.prototype).constructor(没有) -> f2.__proto__.__proto__(就是Object.prototype).constructor(有) -> Object |
8 otakustay Jul 12, 2013 @pythonee constructor就是一个普通的属性,任何属性都是通过原型链来找的,没有例外,不是很理解你是怎么得了“没有顺着原型链”这个结论的…… |
9 pythonee OP @otakustay 我的求值过程是代入,而不是顺着原型链, f2.constructor(有) == f2.__proto__(就是Foo.prototype).constructor(有) == {}.constructor(有) == Object.prototype.cOnstructor== Object(){[native code]} 我认为constructor是特殊的属性,而不是普通的 |
10 otakustay Jul 12, 2013 @pythonee 是这样的,f2.__proto__.cOnstructor=== {}.constructor,但是{}.constructor是怎么来的呢?{}本身没有constructor(这个是肯定的,你用({}).hasOwnProperty('constructor')试),所以是({}).__proto__.constructor,也就是Object.prototype.constructor,所以还是顺着上去的 所谓“有”还是“没有”,是用.hasOwnProperty('constructor')来检测的,因此在每一级试下这个方法就行了 一种证明他是“顺着找”的方法是 var f2 = new Foo(); console.log(f2.constructor); // function Object() { [native code] } Object.prototype.cOnstructor= 'fuck'; console.log(f2.constructor); // 'fuck' |