gpt4 book ai didi

javascript - 基于原型(prototype)的变量范围,JavaScript 中的 `new` 运算符

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:16:15 25 4
gpt4 key购买 nike

我想知道,在 JavaScript 中使用 new 运算符创建对象时,变量的作用域是什么?

function A(){
this.a = 1; // instance property
}

function B(){
this.a = 3; // instance property
}

案例 1:我明白了

// assign again prototype a property as 2 
A.prototype.a = 2 ;// prototype property

var obj = new A();

console.log( obj instanceof A );
console.log( obj.a == 1 );

案例 2:将 A 构造函数更改为 B 引用

A.prototype.constructor =  B;
A.prototype.a = 2 ;// prototype property


var obj = new A();
console.log( obj instanceof B ); // false, as I expected
console.log( obj.a == 1 ); // still 1 why ?

案例 3:继承范围

A.prototype = new B();
A.prototype.a = 4 ;// prototype property


var obj = new A();
console.log( obj instanceof B ); // true , as I expected
console.log( obj.a == 1 ); // still 1 why ?

我做了一些研究,但找不到正确的解释。

最佳答案

原型(prototype)在对象初始化代码运行之前分配/绑定(bind)到对象

> function A() { console.log(this.a); this.a = 1; console.log(this.a); };
undefined
> new A();
undefined
1
A {a: 1}
> A.prototype.a = 2;
2
> new A();
2
1
A {a: 1, a: 2}

在函数初始化代码中,在为 A.a 分配原型(prototype)之前,第一个 console.log 是未定义的。在分配原型(prototype) A.a 后,第一个 consol.log 正确显示为 (2) 然后 this.a 被分配为 1,第二个 console.log 正确显示为 (1)

关于javascript - 基于原型(prototype)的变量范围,JavaScript 中的 `new` 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17594796/

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