2011-09-03 73 views
0

下小的演示說明我的問題:的JavaScript陣列繼承並使其全球

// 1 - Define a global reference to classA 
(function() { 
    window.classA = new ClassA(); 
})(); 

// 2 - ClassA object definition 
function ClassA() { 
    this.test1 = function() { 
     document.write('test1'); 
    }; 
} 

// 3 - ClassA inherits Array and has a test function 
ClassA.prototype = new Array; 
ClassA.prototype.test2 = function() { 
    document.write(this[0]); 
} 

// 4 - Test our ClassA 
var c = new ClassA(); 
c.test1(); 
c.push('test2'); 
c.test2(); 

// 5 - Test our global ClassA 
classA.test1(); 
classA.push('test2'); // doesn't work 
classA.test2(); // doesn't work 

嘗試在這裏:http://jsfiddle.net/SPSW4/

什麼是定義一個全局變量CLASSA(ClassA的實例)的正確方法?

+0

你的意思是全球在靜態的?你有沒有考慮重新排序你的函數調用? –

+0

全局變量(ClassA的一個實例) – Zyphrax

+0

在JavaScript中沒有類並且命名一個函數_class_沒有任何意義。這使得閱讀非常混亂。請重新考慮你的命名約定;) –

回答

1

在完全定義ClassA之前,您的代碼似乎綁定了全局classA變量。我相信你將有更多的運氣,如果你不喜歡它:

// 1 - define ClassA 
window.ClassA = function() { 
    this.test1 = function() { 
     document.write('test1'); 
    }; 
}; 
ClassA.prototype = new Array; 
ClassA.prototype.test2 = function() { 
    document.write(this[0]); 
} 

// 2 - Define a global reference to classA 
window.classA = new ClassA(); 

// 3 - Test our ClassA 
var c = new ClassA(); 
c.test1(); 
c.push('test2'); 
c.test2(); 

// 4 - Test our global ClassA 
classA.test1(); 
classA.push('test2'); // doesn't work 
classA.test2(); // doesn't work 

下面是一個例子:http://jsfiddle.net/SPSW4/2/

+0

關閉但'window.classA = new ClassA();'會影響我的JavaScript的權利的權利? – Zyphrax

+0

我不確定你在問什麼,確切地說。但是''window.classA = new ClassA();''在完成配置'ClassA'後需要發生*。 – aroth

+0

不完全正確,但主要。正如你通過我的答案所看到的,只有原型需要在作業前完成。這是因爲原型方法應用於使用'new'關鍵字的對象。由於這些方法在'... = new ClassA()'時沒有附加,所以對象不會看到它們。 – vol7ron

0

交換

// 2 - ClassA object definition 
function ClassA() { 
    this.test1 = function() { 
     document.write('test1'); 
    }; 
} 

// 1 - Define a global reference to classA 
(function() { 
    window.classA = new ClassA(); 
})(); 

聲明在JavaScript 以前通話功能,它是一種腳本語言。

+0

當我在小提琴中嘗試它時不起作用,導致未定義 – Zyphrax

+0

你在test2上缺少分號defintion - 請參閱我的回答 – vol7ron

0

試試這個:

// 2 - ClassA object definition 
function ClassA() { 
    this.test1 = function() { 
     document.write('test1'); 
    }; 
} 


// 3 - ClassA inherits Array and has a test function 
ClassA.prototype = new Array; 
ClassA.prototype.test2 = function() { 
    document.write(this[0]); 
} 

// 4 - Test our ClassA 
var c = new ClassA(); 
c.test1(); 
c.push('test2'); 
c.test2(); 

// 1 - Define a global reference to classA 
window.classA = new ClassA(); 

// 5 - Test our global ClassA 
classA.test1(); 
classA.push('test2'); 
classA.test2(); 

其實有兩個問題: 1.創建對象在宣佈類 之前2.在擴展類之前創建對象

+0

與aroth的解決方案相同,這會影響javascript文件的順序。函數調用技術應該防止......但如何把它放在一起。 – Zyphrax

+0

如果你在不同的文件中發生這種情況,那麼你應該在你的問題中這樣說。無論如何,解決方案仍然是一樣的。你只需要做一些*確保你不會嘗試調用''new ClassA()'直到*'ClassA'被完全定義之後。一個合理的方法是移動'window.classA = new ClassA();'部分,使其位於定義'ClassA'的文件的最後。 – aroth

+0

如果我正確理解你,Zyphrax你可以在你的每個文件中做這樣的事情:'if(typeof(classA)==='undefined')window.classA = new ClassA();'。醜陋但會起作用。 –

0

定義您R類別

ClassA = function() 
{ 
    this.test1 = function() 
    { 
     document.write('test1'); 
    }; 
}; 

然後應用陣列原型

ClassA.prototype = Array.prototype; 

然後你可以擴展你的類

ClassA.prototype.test2 = function() 
{ 
    document.write(this[0]); 
}; 

關於「全球參考」的一部分。在你的代碼的第一部分中,你沒有參考,你正在實例化尚未定義的類。也沒有必要這樣做。那部分你有什麼意見?

0


  1. 呼叫前移動類定義。

    注:真正需要是第一位的唯一事情是原型,因爲你的代碼賦給第一類,但從來沒有看到樣機,以後發生的效果。你的班級任務應該在原型之後。

  2. 您在test2()定義後缺少;


// Class Definition 
function ClassA() { 
    this.test1 = function() { document.write('foo'); }; 
} 
    ClassA.prototype  = new Array(); 
    ClassA.prototype.test2 = function() { document.write(this[0]); }; 


// Init 
(function() { 
    window.classA = new ClassA(); 
})(); 

// Method Calls 
var c = new ClassA(); 
    c.test1(); 
    c.push('bar'); 
    c.test2(); 

classA.test1(); 
classA.push('bar'); 
classA.test2(); 
1

正確的做法是一個立即調用的函數表達式中創建僞子類Array構造函數,然後將結果暴露於一個明確的全局對象。

(function(global) { 
    // Declare the ArrayLike constructor 
    function ArrayLike() { 
     var args = [].slice.call(arguments), 
      length = args.length, i = 0; 

     this.length = length; 

     for (; i < length; i++) { 
      this[ i ] = args[ i ]; 
     } 
     return this; 
    } 
    // Define ArrayLike's prototype by creating a new Array instance 
    ArrayLike.prototype = new Array(); 

    // Define your own proto method 
    ArrayLike.prototype.firstChar = function() { 
     var ret = [], 
      length = this.length, i = 0; 

     for (; i < length; i++) { 
      ret[ i ] = this[ i ][ 0 ]; 
     } 
     return ret; 
    }; 
    // Expose the ArrayLike constructor. 
    global.ArrayLike = ArrayLike; 
})(this); 

var a = new ArrayLike("alpha", "beta", "gamma"); 

console.log(a.push("delta")) // 4 
console.log(a); // ["alpha", "beta", "gamma", "delta"] 
console.log(a.firstChar()); // ["a", "b", "g", "d"] 

親身體驗:http://jsfiddle.net/rwaldron/gLdkb/