在JavaScript中,据说对象文字有原型链接,但是 函数对象具有原型链接和原型属性。
那么,基于上面的说法,可以说继承(使用prototype属性)只能用于函数对象(构造函数版本)而不能用于对象文字吗?
另外,要添加,所有浏览器都无法访问__proto__
属性...
答案 0 :(得分:2)
简短版:
是:通过分配对象的prototype
属性,无法设置或修改原型链。您不能通过创建具有对象文字的对象然后为其提供名为prototype
的属性来设置继承。这样的属性将被称为prototype
,但不会被视为原型继承。
更长:
如果访问undefined
的属性,则会检查该对象的继承链。因此,如果obj['prop']
为undefined
,则会检查obj.prototype['prop']
。在许多浏览器中,prototype
属性在内部实现为__proto__
属性,但除此之外。相反,关键是如果某个属性为undefined
,则会检查对象的原型是否属于该属性。
正如人们在评论中所说的那样,只有通过将该对象赋值给函数的prototype
属性,然后将该函数用作构造函数,才能赋予对象一个提供上述继承的原型。
但是,构造函数invokation生成的对象的prototype
属性不是object.hasOwnProperty('prototype')
。另一方面,如果您为对象分配prototype
属性,那么该对象将object.hasOwnProperty('prototype')
,但object.prototype
将与原型链无关 - 它只会成为常规财产,并且恰好打电话给prototype
。
为了证明这一点:
var foo = {};
foo.prototype = {bar: 'hello'};
console.log(foo.bar); // undefined
console.log(foo.prototype); // Object {bar: "hello"}
console.log(foo.hasOwnProperty('prototype')); // true
var Foo = function() {};
Foo.prototype = {bar: 'hello'};
var f = new Foo;
console.log(f.bar); // 'hello';
console.log(f.hasOwnProperty('bar')); // false
console.log(f.prototype); // undefined
console.log(f.hasOwnProperty('prototype')); // false