明显误解了,new 的意思相当于是构建一个空对象,然后将constructor的prototype对象assign给这个对象,然后将constructor内的this指向这个对象,然后执行constructor,最后返回这个对象,所以:
1. 最终得到的对象和constructor.prototype不是同一个对象,但是这个对象包含prototype的所有属性与方法(在没有被constructor复写的情况下值相等)
2. 如果prototype的某个属性是一个premitive value,那么在得到对象上修改这个属性并不会影响prototype,但是如果是一个引用,再去改这个引用的内部值,就会影响prototype:
function Ctor(name, profile) {
name && (this.name = name);
profile && (this.profile = profile);
}
Ctor.prototype.name = 'hello world';
Ctor.prototype.profile = {address: 'tokyo'}
var inst1 = new Ctor('hello'); // 重写了name
var inst2 = new Ctor(void 0, {address: 'redirect'}); // 重写了profile
var inst3 = new Ctor(); // 没有重写
inst1.name = 'hello 2';
inst2.name = 'hello world 2';
inst3.name = 'hello world 3';
// 以上3条都不影响prototype
inst1.profile = {address: 'new profile address'}
// 不会影响prototype,只是自身的profile指向了一个新地址
inst2.profile.address = 'new address';
// 也不会影响prototype,因为这里的profile地址在构建的时候就已经指向了另一个地址
inst3.profile.address = 'modified address 2';
// 会影响prototype,也会影响其它构建过了没有修改过的实例,因为指向同一个地址
console.log(inst1.name, inst2.name, inst3.name);
// hello 2 hello world 2 hello world 3
console.log(inst1.profile, inst2.profile, inst3.profile, Ctor.prototype.profile);
// Object {address: "new profile address"} Object {address: "new address"} Object {address: "modified address 2"} Object {address: "modified address 2"}
--
FROM 114.249.216.*