关于JavaScript如何工作的一些问题

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如何工作做任何假设,因为我知道它是基于原型的非常不同.

Rob*_*obG 6

函数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)

如果已经定义了一些方法,那么添加方法是有益的.

看看一些图书馆并决定你喜欢什么,一些混合搭配.做任何适合特定情况的事情,通常只需要获得足够的代码就可以看到相同的内容,然后无论您选择何种模式,它都会看起来很整洁.