OOP建议仅公开您希望用户能够访问的变量和方法。我一直在为我的对象使用公共方法声明(即原型)。
DrawShape = function() {
}
DrawShape.prototype.circle = function() {
// draw logic here
}
DrawShape.prototype.square = function() {
// draw logic here
}
这种方法似乎效率最高,因为每次实例化实例时都不会重写该方法。但是我发现要创建好的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";
}
这里我创建了一个名为setColour的方法,该方法仅用于由其他方法运行。问题是该方法是公开的,任何人都可以调用。
我可以将方法移动到对象构造函数中...但这意味着我不再保存内存(即每次实例化实例时都会重写),这也意味着我必须全部移动我的其他方法进入构造函数。
创建对象时,JavaScript中的最佳做法是什么?
答案 0 :(得分:5)
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
请注意,如果在this
函数中使用setColour
,您必须使用当前值this
来调用它,因为您无法合理地绑定this
对于一个特定的对象(据我所知,即使是ES6也不会让这更容易):
setColour.call(this);
无论如何,那些“你”必须伤害美国人的眼睛......
答案 1 :(得分:1)
我更喜欢这个:
DrawShape = function() {
var circle = function() {
var colour = setColour();
// draw logic here
};
var square = function() {
var colour = setColour();
// draw logic here
};
var setColour = setColour() {
return "blue";
};
return {
circle: circle,
square: square
};
};
我觉得它很好看。而且可读性也很好。
修改强>:
根据评论,我们可以将其改写如下:
DrawShape = function() {
this.circle = function() {
var colour = setColour();
// draw logic here
};
this.square = function() {
var colour = setColour();
// draw logic here
};
var setColour = setColour() {
return "blue";
};
return this;
};
我真的不喜欢IIFC。