构造函数中的私有方法(Javascript,坏主意?)
Private methods within constructor (Javascript, bad idea?)
当我们在原型对象中声明一个方法时,我们在内存中只有一个位置,稍后我们可以在其中调用方法。然而,使用private方法的思想,每次创建新的子对象时,我们都会在内存中重新创建方法。
为了直观起见,看看下面的两个结构:
function Person(firstname, lastname){
this.firstname = firstname,
this.lastname = lastname
}
Person.prototype.getFullName = function() {
return this.firstname + ' ' + this.lastname;
}
var ham = new Person('Hamoodi', 'Josef');
好的,上面的代码创建了一个方法,并将其存储在我们的原型对象中,非常棒。
function Person(firstname, lastname){
this.firstname = firstname,
this.lastname = lastname,
this.getFullName = function() {
return this.firstname + ' ' + this.lastname;
}
}
根据我的理解(如果我错了,请纠正我),这就是我创建私有方法的方式,如果我们需要创建很多孩子,这似乎是个坏主意,或者我只是错过了重点?
有什么想法吗?
您定义getFullName
函数的方式没有任何私人之处。它将在任何Person
实例上可用,并在每个实例中复制。这就是为什么方法被放在构造函数的原型上,以便在实例之间共享。
如果你的构造函数中真的有一个私有函数,它看起来像这样:
function Person(firstname, lastname){
// bind the function to this instance
var getFullName = (function () {
return this.firstname + ' ' + this.lastname;
}).bind(this);
this.firstname = firstname;
this.lastname = lastname;
// call private function and set property
this.fullName = getFullName();
}
这再次受到了负面影响,即每个实例都将创建自己的私有方法副本(但至少这次它的范围实际上是私有的)。
私有方法作为"实用程序"类型的方法通常是有意义的。例如,考虑以下内容:
// your javascript file
(function (global) {
// private scope
var id = 0,
getId = function () {
return ++id;
};
function Person(firstname, lastname) {
// call private method to get id
this.id = getId();
this.firstname = firstname;
this.lastname = lastname;
}
// expose globally
global.Person = Person;
}(window));
现在,当有人使用API创建一个新的人时,它会使用私有的getId函数为该人分配一个唯一的id。希望这能说明您何时考虑使用私有状态与原型上公开可用的方法。
在给定模块中获取私有方法的一种方法是在其他API使用者无法访问的范围中定义它们。
请注意,这可能会使单元测试成为一个挑战,尽管在Node.js中,您可以使用rewire之类的方法来访问私有函数。
function Person(firstname, lastname){
this.firstname = firstname,
this.lastname = lastname,
getFullName.call( this );
}
function getFullName() {
return this.firstname + ' ' + this.lastname;
}
相关文章:
- javascript Ajax方法在不同的浏览器中有不同的结果
- Javascript替换方法有什么问题
- JavaScript:有没有更好的方法来使用回调函数做一个for循环
- JavaScript - 有没有更有效的方法来创建选项元素
- JavaScript:有没有更好的方法来保留你的数组,但有效地连接或替换项目
- 有没有办法在IntelliJ中查找JavaScript的方法结构
- 在 objective-c 中是否有类似的 JavaScript 应用方法
- Javascript:有没有更好的方法在x次异步数据库/ ajax调用后执行函数
- javascript:有没有什么优雅的方法可以检查字符串是否包含数组中给定的任何字符
- JavaScript有像Ruby中的ARGV那样通过终端行传递参数的方法吗?
- Javascript:有没有一种方法可以使用字符串作为回调,而不需要eval()
- javascript有一种方法,我可以循环通过对象没有for循环
- 如何知道你是否写得好'Javascript -有很多方法可以做同样的事情
- Javascript-有没有一种方法可以通过一个命令来销毁数组中的所有元素
- 检查Flash对象是否有来自JavaScript的方法
- Javascript有没有一种方法来实现&;find_if&;或“;FirstOrDefault"
- Javascript:有没有一种方法可以检测用户滚动,但不能通过代码进行滚动(即scrollLeft等)
- Javascript有相同的方法不同的实现
- 这种Javascript继承方法有什么问题吗
- JavaScript:有没有一种方法可以远程启动JavaScript函数?比如onClick