Javascript:轻量级数据持有者的原型表示

时间:2013-10-08 15:25:02

标签: javascript

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

的帖子

在我的情况下,我必须建模一个名为type or class的{​​{1}}的10,000个实例。我需要每个对象保持其状态,比如Shape。使用clone来扩展原型(Eric的帖子中的第二个方法)会导致方法克隆吗?从他的例子来看,

size

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

如果是这样的话,对我来说最好的方法是什么。我的var proto = { hello: function hello() { return 'Hello, my name is ' + this.name; } }; var george = _.extend({}, proto, {name: 'George'}); 拥有10个原始值,并且更多的是充当数据的持有者,而不是抽象行为。要求,

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

1 个答案:

答案 0 :(得分:1)

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

在上面的代码中,您使用的是underscore's extend(需要下划线lib)方法。如果您创建这样的对象。

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之前,您应该清楚了解。它仅在现代浏览器上受支持。以下链接可以帮助您更好地理解

link 1link 2link 3