2010-01-08 91 views
2

我拿起了一本新书在ASP.NET和AJAX和它(一个像瓶盖不JQuery的)有这样一个例子:的Javascript原型

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; 
} 

没有作者只是斯马什同一函数的两个上可接受的声明一起?

回答

2

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

第二个问题,是的,是有区别的。的不明智的:从在其中定义该方法的匿名对象({}

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

继承。 如果这是第二次完成,那么之前的方法会消失,因为继承链现在会指向一个新的匿名对象。

更通常的:

Constructor.prototype.method = function(){} 

简单地定义了一个新的方法。

1

您的第一个问题是,这是一个错字或错误 - 这不是有效的JavaScript。

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

1

对于你的问题的第二部分,如果使用没有新的对象分配给您可以使用继承原型属性:

Person = function() { 
}; 

Person.prototype = new Individual(); 

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

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

第二部分很有意思...谢谢。 – blu 2010-01-08 03:24:20

+0

小心!通过将'Person.prototype'引用与'Individual.prototype'相同的对象,您已将'set_LastName'添加到'Individual'的实例!你可能不想这样做。 – bobince 2010-01-08 04:52:53

+0

哦,你是对的,它应该是Person.prototype = new Individual() – 2010-01-08 05:25:17

1

有与示例的几个问题:

  1. Person应该用var声明。建议始终使用变量来做到这一点。
  2. 错字,在其他答案中提到。
  3. getter/setter模式,可能受C#的属性影响。除非你正在做一些复杂的事情,否则这可能是JavaScript中的矫枉过正,你的代码会更简单地使用一个属性。另外,新的ECMAScript 5规范引入了用于语言属性的getter和setter方法,并且一些浏览器已经实现了它们,但它们还不够普及以至于不能在Web上使用。