基于原型的变量范围,JavaScript中的`new`运算符

rab*_*rab 3 javascript oop

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

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

function B(){ 
   this.a = 3; // instance property
}
Run Code Online (Sandbox Code Playgroud)

案例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 ); 
Run Code Online (Sandbox Code Playgroud)

情况2:将构造函数更改为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 ?
Run Code Online (Sandbox Code Playgroud)

案例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 ?
Run Code Online (Sandbox Code Playgroud)

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

Lou*_*cci 5

Prototype在运行对象初始化代码之前分配/绑定到对象

> 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}
Run Code Online (Sandbox Code Playgroud)

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