gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:54:58 26 4
gpt4 key购买 nike

我正在阅读有关面向对象 JS 的内容,并试图了解基于原型(prototype)的继承是否最适合我的情况。我刚刚读了 Eric Elliot 的文章,介绍了这种方法相对于经典模式的优越性 here

就我而言,我必须对名为 Shape类型或类 的 10,000 个实例进行建模。我需要每个对象保持其状态,例如 size。使用克隆来扩展原型(prototype)(Eric 帖子中的第二种方法)会导致方法也克隆吗?从他的例子来看,

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

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

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

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

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

最佳答案

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 1 , link 2 , link 3

关于Javascript:轻量级数据持有者的原型(prototype)表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19251896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com