使用原型并处理执行顺序

时间:2013-03-03 09:51:23

标签: javascript prototype

我正在努力掌握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);
}

我理解原型设计提供了更好的性能,因为这个函数的副本没有存储在对象的每个实例上,而是每个实例都引用相同的函数(我想每个新实例都可以被认为是一个全新的对象类型?)。但是,原型设计不允许我在定义之前使用函数。此外,prototyped函数无法访问对象的私有成员。

这只是一个问题,因为我正在开展一个项目,其中两个对象需要使用彼此的功能。如果我在代码中更早地放置一个对象,它将无法访问第二个对象,因为原型函数遵循执行顺序(从上到下)。

旁注:我也知道我的对象可能应该是一个对象文字(比如object = {property:value}),但我仍然试图抓住范围和原型来试图处理现在就这样。

2 个答案:

答案 0 :(得分:0)

如果我帮到你,问题的根源是“两个对象需要使用 彼此的功能。“

但实际上Javascript不是一种打字语言:定义TypeA,定义TypeB, 之后你可以使用实例:typeA和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

答案 1 :(得分: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.

同样,它不是函数声明,而是函数表达式的赋值。它还没有发生,因为它低于它。

  

这只是一个问题,因为我正在开展一个项目,其中两个对象需要使用彼此的功能。如果我在代码中先放置一个对象,它就无法访问第二个对象,因为原型函数遵循执行顺序(从上到下)。

在打电话之前,您通常不需要访问任何内容。 "声明"一切都在最初(构造函数,原型属性),然后实例化。