首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript:如何将对象的JSON数组转换回共享原型的对象类型?

Javascript:如何将对象的JSON数组转换回共享原型的对象类型?
EN

Stack Overflow用户
提问于 2011-06-09 03:47:28
回答 6查看 1.6K关注 0票数 6

如果您有一个从JSON创建的产品对象数组,那么如何向这些产品对象添加一个原型方法,使它们都指向相同的方法呢?如何训练JavaScript来识别数组中的所有产品对象都是同一类的实例,而不重新创建它们?

例如,如果我下拉一个产品的JSON数组,并希望数组中的每个产品都有一个原型方法,我如何将单个原型方法添加到每个Product副本中?

我首先想到的是有一个Product构造器,它接受产品JSON数据作为参数,并返回一个新的具有原型的product,等等,它将替换从服务器发送的数据。我认为这是不切实际的,因为您正在重新创建对象。我们只想添加所有对象通用的函数。

是否可以将对象的原型属性$.extend到JSON对象,以便每个JSON对象都引用完全相同的函数(而不是的副本)?

例如:

代码语言:javascript
复制
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到每个产品对象原型:创建一个加载了原型的对象,然后在现有的产品对象上覆盖该对象,会怎么样?你将如何对其进行编码?更好的可能性是什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-06-11 03:19:20

所以,如果我没弄错的话,这是KOGI想法的一个更完整的例子:

代码语言:javascript
复制
// 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函数中的方法。这样,对象的方法就定义在一个地方,然后你就可以这样做了:

代码语言:javascript
复制
// Given a variable "json" with the person json data
var personWithNoMethods = JSON.parse( json );    // Use whatever parser you want
var person = addPersonMethods( personWithNoMethods );
票数 1
EN

Stack Overflow用户

发布于 2011-06-09 03:58:47

首先,您不是在修改Products[0].prototype,而是在修改Object.prototype,这将把该函数放在所有对象的原型上,并使其在每个接触对象的For循环中都是可枚举的。

此外,这不是修改原型的正确方式,并且({}).prototype.something将抛出TypeError,因为.prototype未定义。你想用({}).__proto__.something来设置它。

如果您希望它是某个实例,则需要创建该实例,否则它将是Object的实例。

你可能想要这样的东西:

代码语言:javascript
复制
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填充数组。

票数 2
EN

Stack Overflow用户

发布于 2011-06-09 04:00:20

首先,一个问题是在创建对象时prototype方法是关联的,因此分配给对象的prototype将不起作用:

代码语言:javascript
复制
var Products = [];
Products[0] = {};
Products[0].prototype.foo = function () { return 'hello' } // ***

Products[0].foo(); // call to undefined function

(***实际上,代码在这里失败,因为prototype是未定义的。)

因此,为了附加对象,您需要将实际函数分配给对象:

代码语言:javascript
复制
Products[0].foo = function () { return 'hello'; };

您可以创建一个helper函数来执行此操作:

代码语言:javascript
复制
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.fooobj.bar都将引用相同的foo()bar()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6284333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档