我正在尝试从JavaScript中的对象生成一个类。例如:
var Test = {
constructor: function() { document.writeln('test 1'); },
method: function() { document.writeln('test 2'); }
};
var TestImpl = function() { };
TestImpl.prototype.constructor = Test.constructor;
TestImpl.prototype.method = Test.method;
var x = new TestImpl();
x.method();
但是这不起作用:它只会写'测试2'(无论出于何种原因,构造函数没有被正确定义)。为什么呢?
答案 0 :(得分:1)
您的TestImpl函数是构造函数。通常你会做这样的事情:
var Test1 = function () {
document.writeln('in constructor');
};
Test1.prototype = {
x: 3,
method1: function() { document.writeln('x='+this.x); }
}
var y1 = new Test1();
y1.method1();
y1.x = 37;
y1.method1();
var y2 = new Test1();
y2.method1();
y2.x = 64;
y2.method1();
我觉得你有点倒退。通常,您将原型分配给构造函数,而不是将构造函数分配给原型。
将方法分配给构造函数的原型而不是构造函数中的“this”对象的原因是前一个方法只创建了一个共享函数,而后一个方法创建了一个函数的单独实例。如果您使用大量方法创建大量对象,这很重要(将内存分配保持在合理的数量范围内)。
答案 1 :(得分:1)
我认为你做错了。
请记住,JavaScript实际上根本没有类。它有原型。所以你真正要做的就是创建一个原型对象,它就像你在另一个对象上构建的函数集合一样工作。我无法想象任何有用的目的 - 你能详细说明你想要做什么吗?
虽然我认为你可以通过使用类似的东西来实现它:
var TestImpl = function() {
Test.constructor.apply(this);
};
TestImpl.prototype.method = Test.method;
答案 2 :(得分:0)
var Test = function () {
document.writeln('test 1');
this.method = function() { document.writeln('test 2'); }
};
var x = new Test();
x.method();
答案 3 :(得分:0)
Javascript没有“类”概念,它完全是关于原型和你使用它们的方式[并且你可以用这个小巧的功能来模拟任何类型的继承。 ] 在javascript中,“Function”扮演[Class,Method和Constructor]的角色。
所以为了在Javascript中创建“类”行为,你需要做的就是使用“功能”的力量。
var A = function(){
alert('A.Constructor');
}
A.prototype = {
method : function(){
alert('A.Method');
}
}
var b = new A(); // alert('A.Constructor');
b.method(); // alert('A.Method');
现在关于JS的简洁之处在于,您可以使用相同的方法轻松创建“继承”行为。您需要做的就是将第二类“原型链”连接到第一类,如何?
B = function(){
this.prototype = new A(); // Connect "B"'s protoype to A's
}
B.prototype.newMethod = function() { alert('testing'); }
var b = new B();
b.method(); // Doesn't find it in B's prototype,
// goes up the chain to A's prototype
b.newMethod(); // Cool already in B's prototype
// Now when you change A, B's class would automatically change too
A.prototype.method = function(){ alert('bleh'); }
b.method(); // alert('bleh')
如果您需要更多参考资料,我建议您查看Douglas Crockford's Site 快乐的JS。