gpt4 book ai didi

javascript - 从 JavaScript 构造函数调用原型(prototype)方法

转载 作者:行者123 更新时间:2023-11-29 14:46:59 24 4
gpt4 key购买 nike

我有以下简单的继承模式,我想知道是否可以按照我在构造函数中的方式调用方法(基本上来说,使用 this 而不是“ super 原型(prototype)” .

父类,Pet

function Pet(name) {
this.name = name;
this.nickname = name;

this.adopt();
}

Pet.prototype.adopt = function() {
this.nickname = 'Cutty ' + this.name;
}

Pet.prototype.release = function() {
this.nickname = null;
}

Pet.prototype.cuddle = function() {
console.log(this.name + ' is happy');
}

子类,Lion

function Lion(name) {
Pet.prototype.constructor.apply(this, arguments); // super(name)
this.cuddle();
this.release();
}
Lion.inherits(Pet);

Lion.prototype.adopt = function() {
// DTTAH
}

Lion.prototype.release = function() {
Pet.prototype.release.call(this);
console.log('Thanks for releasing ' + this.name);
}

inherits 助手(我知道 polyfill 不好)

Function.prototype.inherits = function(Parent) {
function ProtoCopy() {}
ProtoCopy.prototype = Parent.prototype;

this.prototype = new ProtoCopy();
this.prototype.constructor = this;
}

我的宠物是这样实例化的 var lion = new Lion('Simba')

在 Lion 构造函数中,
我可以在调用子/父类方法时继续使用 this 吗?或者我应该直接使用父原型(prototype)中的方法吗? (比如对 super()release() 的伪调用)

我问的原因是:

  • 这个 运行时替换
  • constructor 属性并不总是我们所想的(根据我在这里和那里阅读的内容)

我不确定这些东西如何影响生成的对象。

多谢指教!

最佳答案

What is the difference between using this.fn() and MyClass.prototype.fn.call(this) in a constructor function?

这不是特定于构造函数,在实例上调用的所有函数(方法)中都是相同的。

事实上,当 this.fn === MyClass.prototype.fn 时,除了字符数之外没有太大区别,它们的行为完全相同。然而,这个假设并不总是正确的——this 可能不是直接继承自 MyClass.prototype,而是一个子类实例,并且那个子类可能已经覆盖 this.fn 方法。

那么哪个是正确的呢?事实上,两者都是。如果您知道其中的区别,则可以为您的情况选择合适的。其他语言在这里有不同的默认期望,另请参阅 calling static methods .

请注意,您不能用 this.constructor 替换类引用,它也会被覆盖。在合理的设置1 中,this.fn() 总是等同于this.constructor.prototype.fn.call(this)

这类似于super调用必须显式引用父类(super class)的原因,并且不依赖于实例属性(例如this.constructorthis.super或任何类似的东西)。

1: this.fn 是从原型(prototype)继承的常用方法,不是自己的实例特定方法,每个原型(prototype)都有 .constructor 指向其 .prototype 所在的相应构造函数。

关于javascript - 从 JavaScript 构造函数调用原型(prototype)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31524380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com