基本上,我已经学会了如何使用这些模式,但我很好奇它们之间更基本的区别。任何这些模式都可以生成相同的下游代码,但是否有理由使用一个而不是另一个,除了个人喜好之外?如果您有更好的模式,请告诉我。
模式1(基于对象):
var mouseDiff = {
"startPoint" : {"x" :0, "y" : 0},
"hypotenuse" : function(a,b) {
// do something
},
"init" : function(){
// do something
}
}
mouseDiff.init();
模式2(据我所知最传统的模式):
function MouseDiff() {
this.startPoint = {"x" :0, "y" : 0};
}
MouseDiff.prototype.hypotenuse = function(a,b) {
// do something
}
MouseDiff.prototype.init = function() {
// do something
}
var myMouse = new MouseDiff;
myMouse.init();
模式3(使用闭包):
var MouseDiff2 = (function() {
var startPoint = {"x" :0, "y" : 0};
var hypotenuse = function(a,b) {
// do something
};
return {
hypotenuse: hypotenuse,
init : function(){
// do something
}
};
}());
MouseDiff2.init();
Object.create
。这是原型面向对象编程的实现方式。 - RaynosObject.create
通常与Pattern 1一起使用。调用var mouseDiff2 = Object.create(mouseDiff)
会给你一个新的、独立的对象,并在mouseDiff2
中存储一个引用。然后,您可以按照自己的意愿使用它,而不会影响原始对象。 - Ryan KinalmouseDiff
被放置在mouseDiff2
的原型链中。 - RaynosObject.create
会给你一个新对象,通过原型链继承自旧对象。 - Ryan Kinalvar o1 = { "foo": { "bar": "baz" } }; var o2 = Object.create(o1); o2.foo.bar = 42; console.log(o1.foo.bar);
是“克隆”对象破坏原始状态的一个例子。 - Raynos