McS*_*man 1 javascript prototype object
OOP建议只公开您希望用户能够访问的变量和方法.我一直在为我的对象使用公共方法声明(即原型).
DrawShape = function() {
}
DrawShape.prototype.circle = function() {
// draw logic here
}
DrawShape.prototype.square = function() {
// draw logic here
}
Run Code Online (Sandbox Code Playgroud)
这种方法似乎是最有效的,因为每次实例化实例时都不会重写该方法.但是我发现要创建好的DRY,模块化代码我必须创建仅供其他方法访问的方法(即私有方法).
DrawShape = function() {
}
DrawShape.prototype.circle = function() {
var colour = this.setColour();
// draw logic here
}
DrawShape.prototype.square = function() {
var colour = this.setColour();
// draw logic here
}
DrawShape.prototype.setColour = function() {
return "blue";
}
Run Code Online (Sandbox Code Playgroud)
在这里,我创建了一个名为setColour的方法,该方法仅用于由其他方法运行.问题是该方法是公开的,可以被任何人或任何人调用.
我可以将方法移动到对象构造函数中...但这意味着我不再保存内存(即每次实例化实例时都会重写),这也意味着我必须移动所有其他方法进入构造函数.
在创建对象时,JavaScript中的最佳实践是什么?
IIFE的力量(立即调用函数表达式):
DrawShape = function() {
}
(function () {
DrawShape.prototype.circle = function() {
var colour = setColour();
// draw logic here
console.log(typeof setColour); // function
}
DrawShape.prototype.square = function() {
var colour = setColour();
// draw logic here
console.log(typeof setColour); // function
}
function setColour() {
return "blue";
}
console.log(typeof setColour); // function
})();
console.log(typeof setColour); // undefined
Run Code Online (Sandbox Code Playgroud)
请注意,如果this在setColour函数中使用,则必须使用当前值调用它this,因为您无法合理地绑定this到特定对象(据我所知,即使ES6也不会使这更容易):
setColour.call(this);
Run Code Online (Sandbox Code Playgroud)
无论如何,那些"你"必须伤害美国人的眼睛......