2013-03-03 24 views
0

我试图获得对JavaScript的真正掌握,并且我正在为我绊倒一个大问题。我习惯于使用C语言,我发现的其中一个障碍是处理JavaScript的原型功能,并且在声明函数时,因为它涉及到执行顺序。使用原型并处理执行顺序

例如,采取以下代码:

var construct = new Constructor(); //I can do this even if its above the declaration of the object. 

construct.MyPrivilagedFunction(); //Can do this here too, even though it's above the function declaration. 

construct.MyPublicFunction(); //Can't do this because it is above the function declaration. 

function Constructor() { 

    //Private member 
    var m_Ding = "Ding!"; 

    //Accessible publicly and has access to private member. 
    this.MyPrivilagedFunction = function() { 
    console.log(m_Ding); 
    } 
} 
Constuctor.prototype.MyPublicFunction = function() { 
    //Doesn't have access to private members. This doesn't work. 
    console.log(m_Ding); 
} 

据我所知,原型提供了更好的性能,因为那么函数的副本不存储在你的对象的每个实例,而是每个实例都指相同的功能(我猜每个新的实例可以被认为是一个全新的对象类型?)。但是,原型不允许我在定义之前使用函数。此外,原型函数不能访问该对象的私有成员。

这只是一个真正的问题,因为我正在开发一个项目,其中两个对象需要使用对方的功能。如果我先在代码中放置一个对象,它将无法访问第二个对象,因为原型函数遵守执行顺序(从顶部到底部)。我注意到我的对象可能应该是一个对象字面值(比如object = {property:value}),但我仍然试图牢牢把握范围和原型来尝试现在处理。

+0

什么问题不清楚给我。 – 2013-03-03 10:04:00

回答

0

如果我很好,你的问题的根源是“两个对象将需要使用对方的功能 ”。

但事实上Javascript不是一种类型化的语言:定义TypeA,定义TypeB, 之后,您可以使用instanceA:typeB和typeB对象,没有问题。

var Speaker = function(name) { 
    this.name = name ; 
}; 

Speaker.prototype.sayHi = function(aMate) { 
    amate.listenTo(this, ' Hi ' + this.mate.name); // no type checking performed here 
                // so no issue even if Listener 
                // is not defined yet 
}; 

var Listener = function(name) { 
    this.name = name; 
    this.knownMate = []; 
}; 

Listener.prototype.listenTo = function (mate, words) { 
    this.knownMate.push(mate); 
}; 

var aSpeaker = new Speaker('Joe'); 
var aListener = new Listener('Bobby'); 

aSpeaker.sayHi(aListener); 

顺便说一下,你没有在Javascript中的私人成员,只有关闭。 所以是的,在'私人'成员范围之外定义的任何函数将不能读取/写入到它的 。
另请注意,如果性能出现问题,则关闭性能较低的js引擎性能较低。 一个不那么糟糕的解决方案,具有“伪私有”的成员是定义这些成员 不枚举与Object.defineProperty()
(看这里:
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty

0

执行顺序是你写的那个。规则中只有两个例外:“下面的所有内容都是不相关的”:变量和函数声明被挂起,也就是说你可以在上面使用(分配,调用)它们。并提防difference between function declarations and function expressions

你想说的构造函数的var construct = new Constructor() //I can do this even if its above the declaration of the object.

宣言。

construct.MyPrivilagedFunction(); //Can do this here too, even though it's above the function declaration.

有一个在这里没有函数声明。特权方法在构造函数执行过程中被创建(赋值给一个属性的函数表达式)(见上文)。

construct.MyPublicFunction(); //Can't do this because it is above the function declaration.

再次,这是没有函数声明但函数式的分配。它还没有发生,因为它在下面。

这只是一个真正的问题,因为我正在一个项目中两个对象需要使用对方的功能。如果我先在代码中放置一个对象,它将无法访问第二个对象,因为原型函数遵守执行顺序(从顶部到底部)。

在调用任何东西之前,您通常不需要访问任何东西。首先声明一切(构造函数,原型属性),然后实例化。