1
switch 2013-07-11 19:12:15 +08:00
可以查看 ECMAScript 5,裡面定義了 typeof 是如果返回值的。
|
2
guchengf 2013-07-11 19:54:32 +08:00
|
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 2013-07-11 23:19:52 +08:00
一个函数建立的时候,就有.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 2013-07-12 10:00:48 +08:00
@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 2013-07-12 10:51:45 +08:00
@pythonee constructor就是一个普通的属性,任何属性都是通过原型链来找的,没有例外,不是很理解你是怎么得了“没有顺着原型链”这个结论的……
|
9
pythonee OP @otakustay
我的求值过程是代入,而不是顺着原型链, f2.constructor(有) == f2.__proto__(就是Foo.prototype).constructor(有) == {}.constructor(有) == Object.prototype.constructor == Object(){[native code]} 我认为constructor是特殊的属性,而不是普通的 |
10
otakustay 2013-07-12 11:43:40 +08:00
@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' |