问题描述
如果
let variable = new FunctionConstructor();
然后variable.__proto__
= FunctionConstructor.prototype
。什么是variable .__ proto__
(继承自variable
的对象),但没有什么等同于构造函数的prototype
属性。
- “
FunctionConstructor.prototype
有什么语义含义(最好与现实世界对象有关)?” - 如果为
let variable = new FunctionConstructor ();
,则一方面variable
继承自FunctionConstructor
(因为它是使用运算符new FunctionConstructor ();
创建的),另一方面,variable .__ proto __ = FunctionConstructor.prototype
(同样是因为它是由new
运算符创建的),即variable
的原型继承自FunctionConstructor.prototype
。原型继承与普通继承有什么区别?
解决方法
FunctionConstructor.prototype
有什么语义[...]?
这是在定义FunctionConstructor
时创建的对象。因此,无论何时定义函数,它都会立即获得对象属性(prototype
)。在某些情况下,函数不能用作构造函数(例如,箭头函数,class
定义的成员,...)。
可以给该对象其他成员一样的成员。在旧代码中,您经常会看到FunctionConstructor.prototype.myMethod = ....
。在现代版本中,您会看到class
语法,该语法会对该prototype
对象进行类似的初始化。
每当用new
调用构造函数时,此对象将作为原型。进行此类调用时,甚至在执行该函数的任何语句之前,都会创建一个新对象,该对象在函数执行期间将为this
,并由new
返回。该this
对象将为其原型对象设置其__proto__
属性,从而建立原型链。因此,这是原型开始发挥作用的时刻。
如果为
let variable = new FunctionConstructor ();
,则一方面,变量从FunctionConstructor
继承(因为它是使用运算符new FunctionConstructor ();
创建的),
不,这是不正确的。 variable
将不会继承FunctionConstructor
的任何内容。 FunctionConstructor
是具有自身原型(不是其prototype
属性,而是其__proto__
属性)的对象(函数对象),并且该链与{{1 }}。
它有助于可视化这两个独立的原型链。参见How does JavaScript .prototype work?,我在my answer中对此进行了详细说明。
...,另一方面,
variable
(同样是因为它是使用variable.__ proto __ = FunctionConstructor.prototype
运算符创建的),即new
的原型继承自variable
。
这是真的。
原型继承与普通继承有什么区别?
有很多区别。这里有一些:
经典继承依赖于类,这些类为实例提供模板。类定义层次结构,但是实例不能彼此继承。原型继承依赖于构造函数及其FunctionConstructor.prototype
属性。原型只是对象,可以修改,而类不能。
了解更多: