1

我正在阅读面向对象的 JS,并试图了解基于原型的继承在我的情况下是否最好。我刚刚在这里阅读了 Eric Elliot 关于这种方法优于经典模式的文章

就我而言,我必须建模,比如说 10,000 个type or class被调用的实例Shape。我需要每个对象都保持其状态,比如说size。使用克隆来扩展原型(Eric 帖子中的第二个方法)会导致方法也被克隆吗?从他的例子中,

var proto = {
  hello: function hello() {
    return 'Hello, my name is ' + this.name;
  }
};

var george = _.extend({}, proto, {name: 'George'});

在上述情况下,创建 10,000 个实例是否会将 hello 克隆到所有实例中?

如果是这种情况,对我来说最好的方法是什么。Mytype/class拥有 10 个原始值,并且更多地充当数据的持有者而不是抽象行为。要求,

  1. 每个实例都保留私有数据。
  2. 有一些常用方法来获取/设置这些数据(或只是属性)
  3. 易于转换为 Json
4

1 回答 1

1
var george = _.extend({}, proto, {name: 'George'});

在上面的代码中,您使用的是下划线的扩展(您需要下划线库)方法。如果你像这样创建对象。

for (var i = 0; i < 1000; i ++) {
 var obj = _.extend({}, proto, {name: 'George'});
}

所有 1000 个对象都是这样的。

{
  {name: 'George'},
  hello: function hello() {
    return 'Hello, my name is ' + this.name;
  }
};

但以下两种方法在所有 1000 个对象中共享相同的 hello 函数。因此,根据您的意愿选择其中任何一个。

经典方法。

var proto = function (name) {this.name = name || ""};

proto.prototype.hello = function hello() {
    return 'Hello, my name is ' + this.name;   }

var p2 = new proto({name: "george"});

p2.hello() //"Hello, my name is george"

使用 Object.create()

var proto = {
  hello: function hello() {
    return 'Hello, my name is ' + this.name;
  }
};

var p = Object.create(proto, {name: {value: "george"}})

p.hello() //"Hello, my name is george"

在开始使用Object.create之前,您应该有清楚的了解。它仅在现代浏览器上受支持。下面的链接可以帮助您更多地理解这一点

链接 1链接2链接3

于 2013-10-08T15:54:57.007 回答