原型方法如何工作?

时间:2014-11-28 15:56:04

标签: javascript

我试图了解原型继承。但不清楚以下代码:

var obj1 = {
   objMethod : function(){
     return 'name: ' + this.name;
   }
};

var obj2 = {
  [[Prototype]] : obj1,
  name : 'Bhojendra'
};

所以,为了理解代码会说些什么,我试过了:

obj2.objMethod();
obj1.objMethod();

但抛出错误。那么,代码试图说明原型的什么?以及如何使用它?

2 个答案:

答案 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 属性。