如果您有一个从JSON创建的产品对象数组,那么如何向这些产品对象添加一个原型方法,使它们都指向相同的方法呢?如何训练JavaScript来识别数组中的所有产品对象都是同一类的实例,而不重新创建它们?
例如,如果我下拉一个产品的JSON数组,并希望数组中的每个产品都有一个原型方法,我如何将单个原型方法添加到每个Product副本中?
我首先想到的是有一个Product构造器,它接受产品JSON数据作为参数,并返回一个新的具有原型的product,等等,它将替换从服务器发送的数据。我认为这是不切实际的,因为您正在重新创建对象。我们只想添加所有对象通用的函数。
是否可以将对象的原型属性$.extend到JSON对象,以便每个JSON对象都引用完全相同的函数(而不是的副本)?
例如:
var Products = [];
Products[0] = {};
Products[0].ID = 7;
Products[0].prototype.GetID = function() { return this.ID; };
Products[1].ID = 8;
Products[1].prototype = Products[0].prototype; // ??我知道这看起来很糟糕,但是如果您将方法JQuery $.extend到每个产品对象原型:创建一个加载了原型的对象,然后在现有的产品对象上覆盖该对象,会怎么样?你将如何对其进行编码?更好的可能性是什么?
发布于 2011-06-11 03:19:20
所以,如果我没弄错的话,这是KOGI想法的一个更完整的例子:
// Create a person class
function Person( firstName, lastName ) {
var aPerson = {
firstName: firstName,
lastName: lastName
}
// Adds methods to an object to make it of type "person"
aPerson = addPersonMethods( aPerson );
return aPerson;
}
function addPersonMethods( obj ) {
obj.nameFirstLast = personNameFirstLast;
obj.nameLastFirst = personNameLastFirst;
return obj;
}
function personNameFirstLast() {
return this.firstName + ' ' + this.lastName;
}
function personNameLastFirst() {
return this.lastName + ', ' + this.firstName;
}因此,在此结构中,您将定义要添加到addPersonMethods函数中的方法。这样,对象的方法就定义在一个地方,然后你就可以这样做了:
// Given a variable "json" with the person json data
var personWithNoMethods = JSON.parse( json ); // Use whatever parser you want
var person = addPersonMethods( personWithNoMethods );发布于 2011-06-09 03:58:47
首先,您不是在修改Products[0].prototype,而是在修改Object.prototype,这将把该函数放在所有对象的原型上,并使其在每个接触对象的For循环中都是可枚举的。
此外,这不是修改原型的正确方式,并且({}).prototype.something将抛出TypeError,因为.prototype未定义。你想用({}).__proto__.something来设置它。
如果您希望它是某个实例,则需要创建该实例,否则它将是Object的实例。
你可能想要这样的东西:
var Product = function(ID) {
if (!this instanceof Product)
return new Product(ID);
this.ID = ID;
return this;
};
Product.prototype.GetID = function() {
return this.ID;
};然后,通过调用new Product(7)或任何ID填充数组。
发布于 2011-06-09 04:00:20
首先,一个问题是在创建对象时prototype方法是关联的,因此分配给对象的prototype将不起作用:
var Products = [];
Products[0] = {};
Products[0].prototype.foo = function () { return 'hello' } // ***
Products[0].foo(); // call to undefined function(***实际上,代码在这里失败,因为prototype是未定义的。)
因此,为了附加对象,您需要将实际函数分配给对象:
Products[0].foo = function () { return 'hello'; };您可以创建一个helper函数来执行此操作:
var attachFoo = (function () { // Create a new variable scope, so foo and
// bar is not part of the global namespace
function foo() { return this.name; }
function bar() { return 'hello'; }
return function (obj) {
obj.foo = foo;
obj.bar = bar;
return obj; // This line is actually optional,
// as the function /modifies/ the current
// object rather than creating a new one
};
}());
attachFoo(Products[0]);
attachFoo(Products[1]);
// - OR -
Products.forEach(attachFoo);这样做,您的obj.foo和obj.bar都将引用相同的foo()和bar()。
https://stackoverflow.com/questions/6284333
复制相似问题