我试图找出是否(除了显而易见的事实,在一种情况下,以下构造函数的值被设置为构造函数括号之外的函数的名称,而在另一种情况下,值被设置直接到函数本身,在函数内部)这两个代码在任何重要方面都是不同的。
function people(name, age){
this.name = name;
this.age = age;
this.yearsUntilRetire = yearsLeft;
}
function yearsLeft(){
var numYears = 65 - this.age;
return numYears;
}
var natalie = new people("Natalie Portman", 28);
var joony = new people("Joony Boony", 24);
和......这段代码?
function people(name, age){
this.name = name;
this.age = age;
this.yearsUntilRetire = function(){
var numYears = 65 - this.age;
return numYears;
}
}
var natalie = new people("Natalie Portman", 28);
var joony = new people("Joony Boony", 24);
现在,我注意到这两个代码都有用,为了我的目的,完全相同。我只是想知道这两个代码之间是否存在任何差异,或者它们是否完全相同。我更喜欢更紧凑的代码,其中函数嵌套在构造函数内部而不是所有松散的函数之外,但我已经看到几个教程将值设置为构造函数之外的函数(如第一个示例中所示) 。这对我来说有点令人费解,因为在一个自包含的空间中创建一个对象的蓝图似乎更合乎逻辑,而不是在你必须上下扫描以找到它所指的内容的地方,以及在哪里。 / p>
我想我的最终问题是,一种方式是正确的,另一种方式是错的,或者一种方式是有优势而另一种方式不是。是否有一种“正常”的方式来实现这一点,或者它只是对所有人都是免费的,程序员应该做他们想做的事情吗?
答案 0 :(得分:2)
区别在于:
yearsLeft
无法访问people
中定义的本地变量。在第二种情况下确实如此。person
之外定义和访问。person
的每次调用都会创建一个新的内部函数。即对于person
的两个实例,p1.yearsLeft === p2.yearsLeft
将为false
,这可能会令人惊讶。正确的方法是在原型上定义共享属性:
function People(name, age){
this.name = name;
this.age = age;
}
People.prototype.yearsLeft = function() {
var numYears = 65 - this.age;
return numYears;
};
如果您想在JavaScript中了解有关OOP的更多信息,建议您阅读MDN article about it。
答案 1 :(得分:1)
第二个示例将为每个单独的对象创建一个新的函数对象(如果实现优化了它,它们会产生严重的错误),而第一个示例使用函数污染全局命名空间。 / p>
除了Felix的使用原型(+1给他)的方法之外,你还可以使用一个立即执行的闭包来隐藏这个函数:
var people = (function () {
function yearsLeft(){
var numYears = 65 - this.age;
return numYears;
}
return function (name, age) {
this.name = name;
this.age = age;
this.yearsUntilRetire = yearsLeft;
}
}());
从外部函数返回的函数对象被赋值给people
变量,并且它可以访问外部函数中定义的yearsLeft
函数。此函数之外的代码无权访问yearsLeft
(当然,除了通过此函数创建的对象的yearsUntilRetire
属性外)。
虽然这可能不是解决这个特定问题的最佳方法(原型在这种情况下有点清晰)但是这种立即调用返回另一个函数的函数的技术是创建依赖于私有的函数的一种非常强大的方法数据