神奇的new
当使用 new运算符创建一个对象时会把实例对象上 this 的值和方法都深复制一份给新创建对象,同时把实例对象的原型作为新创建对象原型(新创建对象有能力修改实力对象的原型的属性)。
测试1
function Person(name){
this.name = '小明';
age = '123';
this.car = 'BBA';
this.sum = function(){alert(this.name)}
}
Person.prototype.color = 'red'
function Per(){
this.name = '小花'
}
Per.prototype = new Person();
var f1 = new Per();
var f2 = new Per();
console.dir(f1)
/*Per
name: "小花"
__proto__: Person
car: "BBA"
name: "小明"
sum: ƒ ()
__proto__:
color: "red"
constructor: ƒ Person(name)
__proto__: Object */
f1 函数name属性来自 Per构造函数的 name 属性,f1的原型上有car、name属性继承于Per构造函数的原型(new Person), f1原型的原型上有一个color属性继承了Person的原型
测试2
f1.name = '小军';
console.log(f1.name) //小军
console.l0g(f2.name) //小花
f1.__proto__.car = 'JILI';
console.log(f2.__proto__.car) // JILI
由此可见构造函数new出来的新对象修改原型会污染其他实例出来的对象的原型