gpt4 book ai didi

javascript - 为什么实例不继承添加到没有原型(prototype)关键字的构造函数的属性

转载 作者:行者123 更新时间:2023-12-03 01:55:15 25 4
gpt4 key购买 nike

在这个例子中,一个名为“t”的属性被添加到speak函数中。Speak.t=5;当我调用speak()时,它通过另一个名为show的函数打印值5。但是当我创建了 Speak 的新实例,它不继承属性 t。为什么会这样?我的意思是,如果它是 Speak 构造函数的属性,那么它的所有实例都应该继承它?

<html>
<body>
<script>
function Speak(){

show(Speak.t);
}
Speak.t=5;
function show(v){
console.log('value is : '+v);
}
Speak();
var s1=new Speak();
console.log(s1.t);
</script>
</body>
</html>

最佳答案

"i mean if it is a property of Speak constructor all its instances should inherit it?"

没有。它的实例继承自构造函数的原型(prototype),而不是构造函数本身。 JavaScript 是基于原型(prototype)的,而不是“基于构造函数的”。如果您熟悉other OOP languagesSpeak.t类似于公共(public) static property .

将其更改为 Speak.protoype.t = 5 会将属性 t: 5 添加到原型(prototype),该原型(prototype)将继承到其所有实例:

function Speak(){
show(this.t);
}
Speak.prototype.t = 5;

function show(v){
console.log('value is : '+v);
}

var s1 = new Speak(); //"value is : 5"
console.log(s1.t); //5
<小时/>

由于实例继承自其构造函数的原型(prototype),因此您实际上可以通过这样做来实现类继承:

function SpecialSpeak(){}
SpecialSpeak.prototype = new Speak();

这将创建一个 Speak 实例并将其指定为 SpecialSpeak 的原型(prototype)。

new SpecialSpeak() instanceof SpecialSpeak;     //true
new SpecialSpeak() instanceof Speak; //true

由于如果原型(prototype)发生更改,所有 Speak 实例都会更新,因此它也会更新 SpecialSpeak 的原型(prototype)并更新所有 SpecialSpeak的实例。

var s = new SpecialSpeak();
s.v; //undefined
Speak.prototype.v = "text";
s.v; //text

这演示了继承在 JavaScript 中的工作原理。原型(prototype)的链接有时称为 "prototype chain" .

您可能还想查看this great article关于继承。

<小时/>

旁注:由于所有原型(prototype)链都必须有一个起点,

Object.prototype instanceof Object;    //false

虽然Object.prototype是一个对象,但它是所有*继承自的最顶层原型(prototype)(对象),因此它不是Object的实例。它是对象!

* 从 ES5 开始,引入了 Object.create,它允许您创建不继承自 Object.prototype 的对象>.

关于javascript - 为什么实例不继承添加到没有原型(prototype)关键字的构造函数的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25563366/

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