我试图了解原型继承。但不清楚以下代码:
var obj1 = {
objMethod : function(){
return 'name: ' + this.name;
}
};
var obj2 = {
[[Prototype]] : obj1,
name : 'Bhojendra'
};
所以,为了理解代码会说些什么,我试过了:
obj2.objMethod();
obj1.objMethod();
但抛出错误。那么,代码试图说明原型的什么?以及如何使用它?
答案 0 :(得分:2)
这是无效的代码:
var obj2 = {
[[Prototype]] : obj1,
name : 'Bhojendra'
};
您使用的规范语言不属于实际的语言语法。
目前还没有(标准)方法在对象文字中设置原型对象,但是它将在ECMAScript 6中出现。
此时,您可以在浏览器环境和决定支持语法的其他环境中执行此操作:
var obj2 = {
__proto__ : obj1,
name : 'Bhojendra'
};
目前这在某些浏览器中有效,但在ECMAScript 6最终确定之前,它不是官方语法。
因此,通过引用[[Prototype]]
,语言规范的作用是对原型链中的下一个对象进行通用引用。
例如,让我们说我有一个像这样的构造函数:
function Foo() {
this.x = 123;
}
我们从这个构造函数创建一个对象:
var foo = new Foo();
现在foo
对象的原型链如下所示:
foo --> Foo.prototype --> Object.prototype --> null
[[Prototype]]
对象的foo
是位于Foo.prototype
的对象。因此,当您在foo
对象上查找属性时,如果找不到该属性,它将继续在Foo.prototype
对象上进行搜索。它沿着链继续,直到它找到你的属性或用完了要搜索的对象,然后返回undefined
。
因此,原型继承的概念性高级模型将是这样的:
原型链只是一个对象链。让我们假设您想要一个对象,如果您无法在其上找到属性,它会自动在另一个对象上查找该属性。并且让我们说其他对象被设置为在另一个对象上寻找它。这就是原型链。
my_obj -> other_obj -> another_obj
如果您无法在my_obj
上找到属性,它会自动在链中的下一个对象上搜索该属性,依此类推,直到找到它或返回{{1 }}
JavaScript使用"构造函数"以一种有点奇怪和令人困惑的方式设置它的功能。更明确的方法是使用undefined
进行设置。
Object.create()
答案 1 :(得分:1)
请尝试这个:
var obj1 = {
objMethod : function(){
return 'name: ' + this.name;
}
};
var obj2 = {
__proto__ : obj1,
'name' : 'Bhojendra'
};
console.log(obj2.objMethod());
console.log(obj1.objMethod());
问题在于如何定义obj2
的原型。
取自here:
对象继承自构造函数的原型属性,而不是它们的属性 拥有。构造函数的原型被分配给内部 [[Prototype]]属性在某些浏览器中可用作为 proto 属性。