来自实例的Javascript原型

时间:2014-08-12 11:44:40

标签: javascript prototype

我想用早期创建的对象作为原型来制作对象。这样我就可以在不修改现有对象的情况下添加它们。

与早期创建的对象交互的方法(因此使用那些属性并可能改变它们)也可以应用于新派生的对象。

我认为这可以通过以下代码完成,但它不会......

objs = [];

for (var i = 0; i < 5; i++) {
    objs.push({
        index: i
    });
}

for (var i = 0; i < 5; i++) {
    var newObj = {};
    newObj.prototype = objs[i];
    alert(newObj.index);
}

http://jsfiddle.net/q5bu25L1/2/

2 个答案:

答案 0 :(得分:1)

当您使用构造函数创建对象的实例时,原型开始起作用。为了让您的方法起作用,您可以这样做:

for (var objI in objs) {
    var obj = objs[objI];
    var newObj = function() {};
    newObj.prototype = obj;
    newObj = new newObj();
    console.log(newObj.i);
}

http://jsfiddle.net/q5bu25L1/3/

或者你可以使用Object.create(),它完成了几乎相同的事情。

请注意,如果父对象本身包含对象,则这些方法都不能完全阻止父对象的内容被修改。例如:

var a = { n: 8, myObj: { i: 7 }};
var b = Object.create(a);

b.n = 10;
console.log(a.n);  // still 8
console.log(b.n);  // 10

b.myObj.i = 15;
console.log(a.myObj.i);  // changed to 15!
console.log(b.myObj.i);  // 15

http://jsfiddle.net/0f5ydL6u/

答案 1 :(得分:1)

使用原生Object.create() ECMA5规范

怎么样?

look at the full support comparison

objs = [];

for (var i = 0; i < 5; i++) {
    objs.push({
        index: i
    });
}

for (var i = 0; i < 5; i++) {
    var newObj = Object.create(objs[i]);
    alert(newObj.index);
}

DEMO