繁体   English   中英

最优化的方法来创建JS Object

[英]Most optimized way to create JS Object

我正在寻找在JS中拥有对象的最优化方法; 因为JS允许你以多种方式做某事我想知道哪些被认为是“最佳实践”。

对象的概念用法是这样的:

var John = new Person('John');
var Foo = new Person('Foo');

console.log(John.getName()); //Return 'John'
console.log(Foo.getName()); //Return 'Foo'
console.log(John.name); //undefined
console.log(Foo.name); //undefined

我在这里有一些例子:

示例#1:

var Person = function (name) {
    this.getName = function () { return name; }
}

在这里,我实际上没有属性; “name”无法更改或由public读取,getName方法可以公开访问,并使用本地名称变量调用。 这实际上满足了我的需求。

示例#2:

function Person (name) {
    this.getName = function () { return name; }
}

这与示例#1具有相同的行为。 我只是不确定var method = function () {};之间的区别var method = function () {}; function method() {}; 从功能和性能的角度来看。

示例#3:

var Person = function (name) {
    this.name = name;    
    Person.prototype.getName = function () { return this.name; }
}

这里我有name属性,可以公开读/写,我也有一个可以公开访问的原型getName方法。

示例#4:

var Person = function (name) {
    this.name = name;
    if (!Person._prototyped) {
        Person.prototype.getName = function () { return this.name; }
        Person._prototyped = true;
    }
}

在这里,我拥有示例#3中的内容,区别在于我确保原型方法只设置一次且仅在需要时设置。

所以最后的问题是,你建议我遵循哪些,或者如果他们中的任何一个,那么哪种方式是最佳实践?

对于你想要的,最好的方法可能是:

/**
 * @constructor
 */
function Person(name) {
    this.getName = function() {
        return name;
    };
}

为什么是这样? 好吧,首先,封装。 如果可能,您通常希望将函数放在原型中,如下所示:

/**
 * @constructor
 */
function Person(name) {
    this.name = name;
}

Person.prototype.getName = function() {
    return this.name;
};

然而! 在这种情况下,您似乎不希望Person.name可访问。 因此,您需要使用闭包。

至于这个方法:

var Person = function (name) {
    this.name = name;    
    Person.prototype.getName = function () { return this.name; }
}

这不好。 您公开公开this.name ,因此它没有Person.prototype.getName于以前的原型方法,但是您不断使用相同的函数覆盖Person.prototype.getName 这样做是没有意义的; this将是每次都适当的对象。 更重要的是, Person.prototype.getName在实例化第一个Person对象之前是不可访问的,因此首先使它“公开”并没有多大意义。 你的第四个例子基本相同,更难以理解,但它仍然具有所有的缺点。

所以,在这种情况下,请使用第一个版本; 但是,尽可能在prototype上设置方法,以便可以在实例外部调用它们。

最后,我建议使用:

function Person() {
}

过度

var Person = function() {
}

因为1)第二个例子缺少一个分号,2) var意味着构造函数是变量,它不应该是,3)我不相信JDoc允许@constructor应用于它,导致Closure中的警告编译器至少1


1好吧,不是那么重要。 但还是......

在示例3和4中,它应该是:

var Person = function (name) {
    this.name = name;    
};
Person.prototype.getName = function () { return this.name; }

和:

var Person = function (name) {
    this.name = name;
};

if (!Person._prototyped) {
    Person.prototype.getName = function () { return this.name; }
    Person._prototyped = true;
}

因为每次调用构造函数时都不需要弄乱原型。

不确定哪个是最快的(因为它们都适用于您的目的),这是您的要求,但我不担心,因为这似乎是微优化。 如果您必须知道,那么您可以使用http://jsperf.com/这样的网站

我能想象的最快方式是:

function Person(name) {
    this.getName = function() {
        return name;
    };
}

正如minitech所说。 原因如下:

每次js引擎必须“向上”原型链时,它会消耗掉一小部分ms(或IE上的一小部分:)),并且因为声明变量会占用时间(也可以忽略不计),所以你要避免这样做太。 希望有所帮助

在node.js上运行良好。 AFAIK,论证是可变的。 闭包会记住价值观。 因此,这将有效。 我想这解决了这一切。

var Person = function(Name) {
    this.getName = function(){return Name;}
    this.setName = function(newName)  { Name = newName; }
},

me  = new Person('John');
console.log(me.getName());
me.setName('Peter');
console.log(me.getName());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM