2016-09-12 25 views
0

次のコード(「JavaScript Ninjaの秘密」から取得した関数の短いバージョン)では、「初期化」変数が宣言されているときの動作を理解していませんそれが宣言されていないときに反対している。宣言された変数とjs関数の宣言されていない変数

私がそれを宣言すれば、値は常に偽になります。私が気づいたもう一つのことは、変数が宣言される方法は、proto = new this()、proto = new Class()の場合、 'initialize'変数が予測可能な振る舞いを持つ場合にのみ関係するということです。このような行動のダイナミクスを私に説明するほど親切な人がいますか?お返事のための

Object.subClass = function(properties) { 
 

 
    initializing = true; 
 
    var proto = new this(); 
 
    initializing = false; 
 

 
    function Class() { 
 
    console.log(initializing) 
 
    } 
 

 
    Class.prototype = proto; 
 
    Class.constructor = Class; 
 
    Class.subClass = arguments.callee; 
 
    return Class; 
 
}; 
 

 
var Constructor = Object.subClass() 
 
var subConstructor = Constructor.subClass() // true 
 
var instance = new subConstructor() // false 
 

 
// if var initializing = true; 
 
var proto = new this(); 
 
initializing = false; 
 

 
var Constructor = Object.subClass() 
 
var subConstructor = Constructor.subClass() // false 
 
var instance = new subConstructor() // false

+2

参考までに、この例ではJavaScriptで行うべきではないことがたくさんあります。継承を実装するのは間違った方法です。 –

+0

あなたが求めていることはまったく明らかではありません。 ''初期化 'は、' '宣言したときに常に' 'false 'であると話しました。これは間違っています(' '宣言されていない' 'var''宣言で上のコードを実行します。 '' false')。また、スニペットはエラーをスローします。あなたが尋ねていることを示すコード(宣言の有無にかかわらず)を正確に更新してください。 –

+0

Madaraが言ったように、これは継承を実装するための真剣に欠陥のある方法です。引数のない間違った時刻にスーパークラスのコンストラクタを呼び出します。どうやらこれは 'initializing'フラグが修正しようとしているものですが、それは間違っているだけです。 –

答えて

0

おかげで、十分に自分自身を明らかにしないために私の悪いです。私の質問は、初期化変数の振る舞いから茎、

Object.subClass = function(properties) { 

    initializing = true; 
    var proto = new this(); 
    initializing = false; 

    function Class() { 
     console.log(initializing) 
    } 

    Class.prototype = proto; 
    Class.constructor = Class; 
    Class.subClass = arguments.callee; 
    return Class; 
}; 

var Constructor = Object.subClass() 
var subConstructor = Constructor.subClass() // true 
var instance = new subConstructor() // false 

Object.subClass = function(properties) { 

    var initializing = true; 
    var proto = new this(); 
     initializing = false; 

    function Class() { 
     console.log(initializing) 
    } 

    Class.prototype = proto; 
    Class.constructor = Class; 
    Class.subClass = arguments.callee; 
    return Class; 
}; 

var Constructor = Object.subClass() 
var subConstructor = Constructor.subClass() // false 
var instance = new subConstructor() // false 

私は、これはプロトタイプベースを実装するための悪い方法である知っている:ここでは別の試みです。あなたは、Object.subClassの最初の例で宣言されていないを観察することができたよう

呼び出されたときに、変数を「初期化」、オブジェクトの2番目の例では

呼び出されるコンテキストに応じて、trueまたはfalseを返します。 subClass、宣言された '初期化'変数は呼び出されると、呼び出されるコンテキストに関係なく、falseのみを返します。

関連する問題