Javascript原型(像Closures而不是JQuery)

时间:2010-01-08 03:13:27

标签: javascript prototype closures

我刚刚上了一本关于ASP.NET和AJAX的新书,其中有一个这样的样本:

Person = function(firstName) {
    this._firstName = firstName;
}

Person.prototype = {
    get_FirstName = function() {return this._firstName;}
}

我立即注意到这不是我习惯的,而FireBug显然同意我的说法。我习惯了这样的事情:

Person.protoype = {
    get_FirstName: function() {return this._firstName;}
}

这只是作者的一个错字,还是他可能正在使用ASP.NET AJAX库中的一个功能?

此外,上述功能与此之间是否存在差异:

Person.protoype.get_FirstName = function() {
    return this._firstName;
}

作者是否只是将两个可接受的相同功能的声明混合在一起?

4 个答案:

答案 0 :(得分:2)

第一个问题,是的,我认为这是一个错字。

第二个问题,是的,有区别。不好意思:

Constructor.prototype = { method : function(){} }

继承自定义方法的匿名对象({})。 如果这是第二次完成,那么前一个方法将消失,因为继承链现在将指向一个新的匿名对象。

更常见的是:

Constructor.prototype.method = function(){}

只是定义一种新方法。

答案 1 :(得分:1)

对于你的第一个问题,这是一个错字或错误 - 它不是有效的javascript。

关于你的最后一个问题实际上两个例子之间的区别,如果已经有一些东西附加到原型上。设置原型属性的第一个将删除先前对原型进行的任何其他操作,而第二个仅添加已经存在的内容。我会(并且确实)使用第二种方法,为原型添加一个新属性。

答案 2 :(得分:1)

对于问题的第二部分,如果您使用不将新对象分配给prototype属性,则可以使用继承:

Person = function( ) {
};

Person.prototype = new Individual( );

Person.protoype.set_LastName = function( lastname) {
    this.lastName = lastname
};

//inherited from Individual:
Person.get_FirstName( );

答案 3 :(得分:1)

示例中存在一些问题:

  1. Person应与var一起声明。建议始终使用变量进行此操作。
  2. 其他答案中提到的拼写错误。
  3. getter / setter模式,可能受C#属性的影响。除非你做了一些复杂的事情,否则这在JavaScript中可能有点过分,你的代码只需使用一个属性就会更清晰。另外,新的ECMAScript 5规范引入了语言属性的getter和setter方法,有些浏览器已经实现了它们,但它们还不够广泛,无法在网络上使用。