【发布时间】:2020-03-08 12:30:28
【问题描述】:
我们知道 JavaScript 有原型继承而不是经典继承,这意味着每个对象 具有 [[Prototype]] 属性,可用于通过原型链进行继承。
然而,我无法理解的这个原型继承模型的一部分是函数(或类)对象最初获得的默认原型属性背后的逻辑。即
//For classes
class Dog {}
Dog.prototype // {constructor: Dog}
//For functions
function Cat() {}
Cat.prototype // {constructor: Cat};
让这个属性包含指向函数本身的构造函数属性的可能用途是什么?我理解一种用法,即创建的任何对象都将获得构造函数属性,并且如果定义以某种方式丢失(像这样),则可用于创建更多对象:
function Dog(name) {
this.name = name;
alert(name);
}
let dog = new Dog("White Dog");
let dog2 = new dog.constructor("Black Dog");
但这并不能证明这样的设置是合理的,老实说这是相当复杂的(因为函数/类是唯一对自身具有这种循环引用的对象)。这个决定背后还有其他原因吗?
【问题讨论】:
-
可以使用
dog.constructor获取用于创建对象的构造函数/类 -
prototype属性是一个对象,可用于您使用构造函数创建的任何实例:该原型对象将是原型链中实例的父对象。 -
在引入
class语法之前,除了分配给构造函数的prototype属性之外,没有其他方法可以定义“类”的所有实例(例如方法)共有的成员。所以这也是历史的事情…… -
我不认为这符合您的预期:
new Dog.constructor("return 1+1")() == 2。回顾一下:函数是对象,它们有一个原型属性,您可以填充在使用new调用函数并返回对象时继承的成员。 function.prototype 主要是暴露出来的,所以你可以修改它,迭代它等等。它是继承链的样子。 -
@adiga 是的,我确实在帖子中提到了这种用法。想知道是否还有其他有用的东西
标签: javascript function inheritance prototype