【发布时间】:2012-01-31 06:40:57
【问题描述】:
我正在寻找在 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”不能被公共更改或读取,getName 方法可以公共访问并使用本地名称变量调用。这实际上满足了我的需求。
示例 #2:
function Person (name) {
this.getName = function () { return name; }
}
这与示例 #1 具有相同的行为。从功能和性能的角度来看,我只是不确定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 中的内容,不同之处在于我确保原型方法仅设置一次且仅在需要时设置。
所以最后的问题是,您会建议我遵循哪些方法,或者如果其中任何一种方法是最佳做法?
【问题讨论】:
-
虽然没有公共 name 属性,但 getName 是公共的并且可以被替换,因此可以有效地修改 name .上述内容对公共 name 属性没有任何好处,它只是为闭包和额外的函数调用使用更多资源来访问该值。不过,使用 getter 是有正当理由的。
标签: javascript oop optimization constructor prototype