当我们在属性(超类型中的数组)中有引用值时,使用Crockford的方法(http://javascript.crockford.com/prototypal.html)不起作用,因为这在所有对象中都很常见。
那么,在没有问题的Javascript中进行对象继承的推荐方法是什么,并且可以直观地封装所有对象的方法和属性?
示例:
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
var p1 = {name: "nick", friends : ["a1", "a2"]};
var p2 = Object.create(p1);
p2.name ="john";
p2.friends.push("andre");
alert(p1.friends);
alert(p2.friends);
alert(p1.name);
alert(p2.name);
friends数组为p1和p2返回相同的值,而我希望它返回不同的值。
答案 0 :(得分:0)
嗯,原型链中较高的成员是“共享的”,这是原型继承的目标......
但是,您可以为新创建的对象分配自己的属性(就像使用name
属性一样,例如:
var foo = {foo: "xxx", array : ["a1", "a2"]};
var bar = Object.create(foo);
bar.foo = "yyy";
bar.array = ["b1", "b2"];
bar.array.push("bar");
alert(foo.array); // ["a1", "a2"]
alert(bar.array); // ["b1, "b2", "bar"]
alert(foo.foo); // "xxx"
alert(bar.foo); // "yyy"
latest browser versions上提供的标准 Object.create
方法提供了一种使用第二个参数创建自己的属性的方法,例如:
// ...
var bar = Object.create(foo, {
foo: { value: 'yyy'},
array: {value: ["b1", "b2"] }
});
// ...
答案 1 :(得分:-1)
你能提供一些不起作用的例子吗?原型继承真正意味着对象文字。如果您尝试修改作为数组创建的内容,我知道使用继承的唯一方法是修改Array.prototype。