下面的小演示说明了我的问题:
// 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 :(得分: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/
答案 1 :(得分: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"]
答案 2 :(得分: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中调用函数,它是一种脚本语言。
答案 3 :(得分: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.在扩展类
之前创建对象答案 4 :(得分:0)
定义您的课程
ClassA = function()
{
this.test1 = function()
{
document.write('test1');
};
};
然后应用数组原型
ClassA.prototype = Array.prototype;
然后你可以扩展你的课程
ClassA.prototype.test2 = function()
{
document.write(this[0]);
};
关于“全球参考”部分。在代码的第一部分中,您没有参考,您正在实现一个尚未定义的类。也没有必要这样做。你对那部分有什么看法?
答案 5 :(得分:0)
在调用之前移动类定义。
注意:唯一真正需要的是原型,因为您的代码首先分配类,但从未看到原型的影响,后者会在稍后发生。您的课程作业应该在原型之后。
您在;
定义后遗漏了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();