【问题标题】:Right way to use Prototypal Inheritance in JavaScript?在 JavaScript 中使用原型继承的正确方法?
【发布时间】:2010-10-18 01:37:04
【问题描述】:

当我们在属性(超类型中的数组)中有引用值时,使用 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 返回相同的值,而我希望它返回不同的值。

【问题讨论】:

  • 很遗憾,目前我能想到的唯一解决方案是深度克隆。希望有人有更好的主意。

标签: javascript


【解决方案1】:

好吧,原型链中更高的成员是“共享的”,这就是原型继承的目标......

但是,您可以将自己的属性分配给新创建的对象(就像使用 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"] }
});
// ...

【讨论】:

    【解决方案2】:

    你能举个例子说明什么不起作用吗?原型继承实际上是针对对象字面量的。如果您尝试修改创建为数组的内容,我知道使用继承的唯一方法是修改 Array.prototype。

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 2013-05-09
      • 2016-07-29
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多