从对象生成类(JavaScript)

时间:2009-08-07 15:50:14

标签: javascript class object

我正在尝试从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'(无论出于何种原因,构造函数没有被正确定义)。为什么呢?

4 个答案:

答案 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。