Tes*_*rex 14 javascript coding-style object
在Javascript中定义可重用对象的基本方法是什么?我说可重用以排除单例技术,例如直接用对象文字表示法声明变量.我在某处看到克罗克福德在他的书中定义了四种这样的方法,但我宁愿不用为这一小段信息买一本书.
以下是我熟悉的方法:
使用this和构建new(我认为这被称为经典?)
function Foo() {
var private = 3;
this.add = function(bar) { return private + bar; }
}
var myFoo = new Foo();
Run Code Online (Sandbox Code Playgroud)使用类似的原型
function Foo() {
var private = 3;
}
Foo.prototype.add = function(bar) { /* can't access private, correct? */ }
Run Code Online (Sandbox Code Playgroud)返回文字,而不是使用this或new
function Foo() {
var private = 3;
var add = function(bar) { return private + bar; }
return {
add: add
};
}
var myFoo = Foo();
Run Code Online (Sandbox Code Playgroud)我可以想到这些相对较小的变化可能无关紧要.我错过了什么样的风格?更重要的是,每种方法的优缺点是什么?是否有推荐人坚持,或者是偏好和圣战?
Ry-*_*Ry- 14
使用原型.从构造函数返回特定对象使它们成为非构造函数,并且分配方法this使继承不太方便.
优点:
如果一个人忘了new,他们仍然会得到这个对象.
您可以创建真正的私有变量,因为构造函数中定义的对象的所有方法都共享其范围.
缺点:
new或没有new.new Foo() instanceof Foo也会导致false.prototype优点:
你让构造函数整洁.
这是在JavaScript中执行操作的标准方法,所有内置构造函数都将其方法放在原型上.
继承变得更容易,更正确; 你可以(并且应该)使用Object.create(ParentConstructor.prototype)而不是new ParentConstructor(),然后ParentConstructor从内部调用Constructor.如果要覆盖方法,则可以在原型上执行此操作.
您可以在创建对象后对其进行"修改".
您可以扩展您无权访问的构造函数的原型.
缺点:
它可能有点过于冗长,如果你想更改函数的名称,你也必须改变添加到原型中的所有函数.(或者将原型定义为具有兼容属性描述符的一个大对象文字constructor.)
它们不共享特定于实例的范围,因此您不能真正拥有私有变量.
this.*在构造函数中分配优点:
缺点:
Array.prototype.slice.call(collectionLikeObject).