2010-08-10 94 views
7

我有一些對象,比如son,我想從另一個對象father繼承。將原型添加到對象文字

當然我可以做一個構造函數的父親,像

Father = function() { 
    this.firstProperty = someValue; 
    this.secondProperty = someOtherValue; 
} 

然後用

var son = new Father(); 
son.thirdProperty = yetAnotherValue; 

但是這不正是我想要的。由於son將具有許多屬性,因此將兒子聲明爲對象文字將更具可讀性。但是,我不知道如何設置它的原型。

做這樣的事情

var father = { 
    firstProperty: someValue; 
    secondProperty: someOtherValue; 
}; 
var son = { 
    thirdProperty: yetAnotherValue 
}; 
son.constructor.prototype = father; 

將無法​​正常工作,因爲原型鏈似乎被隱藏,並且不關心constructor.prototype的變化。

我想我可以使用__proto__屬性在Firefox,像

var father = { 
    firstProperty: someValue; 
    secondProperty: someOtherValue; 
}; 
var son = { 
    thirdProperty: yetAnotherValue 
    __proto__: father 
}; 
son.constructor.prototype = father; 

但是,據我瞭解,這是不是語言的標準功能,它是最好不要直接使用它。

有沒有一種方法來指定對象文字的原型?

+0

http://stackoverflow.com/questions/1592384/adding-prototype-to-object-literal – 2012-12-01 20:04:36

回答

11

你說得對,__proto__是非標準的屬性,你必須設置一個新的對象的[[Prototype]],只有兩個標準方法是:

  • 通過使用一個構造函數和new運營商(如你已經提到)。
  • 使用ECMAScript 5 Object.create方法。

Object.createwidely supported尚未(適用於IE9Pre3 +,火狐3.7Alpha +,Chrome瀏覽器的Safari 5+ 5+,犀牛1.7),但在某些時候所有的實現將符合該規範ES5。

它可以有兩個參數,第一個是將用作新對象的[[Prototype]]的對象,第二個是另一個對象,其中可以描述自己的屬性(與您的結構相同將使用Object.defineProperties)。

例如:

var father = { 
    firstProperty: 1, 
    secondProperty: 2 
}; 

var son = Object.create(father, { 
    thirdProperty: { 
    value: 'foo' 
    } 
}); 

father.isPrototypeOf(son); // true 
son.firstProperty; // 1 

son內部[[Prototype]]屬性將指father,它將包含名爲thirdProperty的值屬性。

+1

你的答案清除了我所有的疑惑,但遺憾的是Object.create的語法(加上了「value:」)更不可讀。 – Andrea 2010-08-10 20:01:56

+1

是的,他們爲什麼不能創建一個只接受對象字面值的函數。我的意思是,大多數時候我們只關心鍵和值,而不是像只讀屬性元數據那樣關心。 – 2012-12-01 20:27:16

-1

指定對象文本的原型有點「不可思議」,因爲您首先需要使用構造函數語法(例如,新的X())創建的對象上的原型。不要說這是不可能的......但這很奇怪。一個類似的模式被證明是很好的(例如jQuery所使用的),而是將原型定義爲對象文字。例如:

var X = function() {}; 
X.prototype = { 
    protoFunc1: function() {}, 
    protoFunc2: function() {} 
}; 
2

這是不正確的jmar777。例如,如果你有

var X = function() {}; 
X.prototype = { 
    protoFunc1: function() { console.log('p1');}, 
    protoFunc2: function() { console.log('p2');} 
}; 

X.protoFunc1(); // is not a function 

這意味着,你在做什麼:

X.prototype = {} 

僅僅是創建一個名爲原型的對象。不是實際的原型。要使用原型,你必須使用構造函數。

然而,如果你將它修改爲這個(構造函數方法)

function X(){}; 
X.prototype.protoFunc1 = function() { 
    console.log('p1'); 
} 
X.prototype.protoFunc2 = function() { 
    console.log('p2'); 
} 

var x = new X(); 
x.protoFunc1(); //'p1' 

它的工作。

要麼使用對象字面值方法而不使用原型或使用使用原型的構造器方法。