Kay*_*lly 5 javascript oop prototype function
我最近一直在深入研究JavaScript以完全理解语言,并且有一些唠叨的问题,我似乎无法找到答案(特别是处理面向对象的编程).
假设以下代码:
function TestObject()
{
this.fA = function()
{
// do stuff
}
this.fB = testB;
function testB()
{
// do stuff
}
}
TestObject.prototype = {
fC : function
{
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
功能fA和有fB什么区别?他们的范围和潜在能力是否完全相同?它只是惯例还是技术上更好或更合适的一种方式?
如果在任何给定时间只有一个对象的实例,那么将原型添加一个函数fC甚至是值得的吗?这样做有什么好处吗?原型只在处理对象或继承的许多实例时才真正有用吗?
从技术上讲,什么是以我上面的方式或TestObject.prototype.functionName = function(){}每次调用方式向原型添加方法的"正确"方法?
我希望尽可能保持我的JavaScript代码清晰可读,但我也非常感兴趣的是对象的正确约定在语言中.我来自Java和PHP背景,我试图不对JavaScript如何工作做任何假设,因为我知道它是基于原型的非常不同.
函数fA和fB之间有什么区别
在实践中,没有.函数表达式(fA)和函数声明(fB)之间的主要区别在于创建函数时(声明的函数在执行任何代码之前可用,而函数表达式在表达式实际执行之前不可用).您可能会偶然发现与函数表达式相关的各种怪癖.
在这个例子中,我使用函数表达式,只是因为声明一个函数表达式,然后分配结果似乎有点抽象.但这两种方法都没有"正确"或"错误".
如果在任何给定时间只有一个对象的实例,那么将原型中的函数添加到fC中是否值得?
没有.几乎所有进行继承的人都发现普通对象通常更简单,因此"更好".原型继承对于修补内置对象非常方便(例如,在缺少的情况下添加Array.prototype.each).
从技术上讲,在原型中添加方法的"正确"方法是什么......
没有一个.用一些其他对象替换默认原型似乎有点浪费,但是分配由文字创建的对象可能更整洁,更容易阅读顺序分配.对于一个或两个作业,我会使用:
Constructor.prototype.method = function(){…}
Run Code Online (Sandbox Code Playgroud)
但是对于很多方法我会使用对象文字.有些甚至使用经典的扩展功能,并做:
myLib.extend(Constructor.prototype, {
method: function(){…}
});
Run Code Online (Sandbox Code Playgroud)
如果已经定义了一些方法,那么添加方法是有益的.
看看一些图书馆并决定你喜欢什么,一些混合搭配.做任何适合特定情况的事情,通常只需要获得足够的代码就可以看到相同的内容,然后无论您选择何种模式,它都会看起来很整洁.