问题 JavaScript prototype.init疯狂


有人可以在JavaScript中解释prototype.init函数的重要性以及在对象实例化期间调用它的时间吗?

你为什么要用空函数覆盖它?

我正在阅读用于Web书的JavaScript,并且在过去的几个小时里我一直坚持这个......那段代码应该实现什么?

var Class = function(){ 

var klass = function(){
   this.init.apply(this, arguments); 
};

klass.prototype.init = function(){};

// Shortcut to access prototype 
klass.fn = klass.prototype;

// Shortcut to access class 
klass.fn.parent = klass;

...
}

这对我来说太神奇了...... :)


10183
2017-12-20 15:11


起源



答案:


我不确定你不明白。 init 只是一个像任何其他方法一样的方法,恰好在构造函数中调用,并且与构造函数具有相同的参数。如果它是空的,那只是因为编写它的人现在不需要放任何东西但是想要放下他班级的基础。

function Foo(a, b, c) {
    this.init.apply(this, arguments); //This simply calls init with the arguments from Foo
}

Foo.prototype.init = function(a, b, c) {
    console.log(a, b, c);
}

var f = new Foo(1, 2, 3); //prints 1 2 3

http://jsfiddle.net/Hmgch/


12
2017-12-20 15:16



这是完全正确的。 init 在JavaScript中并不特别;将构造函数委托给此作者只是作者的奇怪选择 init 功能。 - Domenic
谢谢。我从2001年开始就没有做过JS ......它已经有一段时间了,而且这些事情甚至还没有发生在我身边:)真正吓到我的是我的错误理解,即默认情况下init在对象创建中很重要。作者使用了无用的奇怪术语...... - Moonwalker
@Moonwalker确实,语言已经发展了很多 - Alex Turpin


答案:


我不确定你不明白。 init 只是一个像任何其他方法一样的方法,恰好在构造函数中调用,并且与构造函数具有相同的参数。如果它是空的,那只是因为编写它的人现在不需要放任何东西但是想要放下他班级的基础。

function Foo(a, b, c) {
    this.init.apply(this, arguments); //This simply calls init with the arguments from Foo
}

Foo.prototype.init = function(a, b, c) {
    console.log(a, b, c);
}

var f = new Foo(1, 2, 3); //prints 1 2 3

http://jsfiddle.net/Hmgch/


12
2017-12-20 15:16



这是完全正确的。 init 在JavaScript中并不特别;将构造函数委托给此作者只是作者的奇怪选择 init 功能。 - Domenic
谢谢。我从2001年开始就没有做过JS ......它已经有一段时间了,而且这些事情甚至还没有发生在我身边:)真正吓到我的是我的错误理解,即默认情况下init在对象创建中很重要。作者使用了无用的奇怪术语...... - Moonwalker
@Moonwalker确实,语言已经发展了很多 - Alex Turpin


什么是应该实现的代码?

混乱。

var Class = function() { 
  // initialization logic
}

// Shortcut to access prototype 
Class.fn = klass.prototype;

// Shortcut to access class 
Class.fn.constructor = Class;

2
2017-12-20 15:15



确实 - 你的思想开始循环......从我理解的原型中,prototype.constructor也具有绝对的重要意义。作者在类级别讨论静态方法,在原型级别讨论实例方法 - 听起来有点倒退.... - Moonwalker
@月球漫步者 prototype.constructor 对于元编程非常重要。例如 instance2 = new (instance1.constructor)(); - Raynos
我错过了那个...... - Moonwalker