<script type="text/javascript">
function Animal() {
this.size = ['large', 'small'];
}
function Cat() {
}
Cat.prototype = new Animal();
var tom = new Cat();
var peter = new Cat()
console.log(tom.size); // ["large", "small"]
console.log(peter.size); //["large", "small"]
console.log(peter.size===tom.size); // true
</script>
首先实例化cat构造函数,给cat的prototype添加Animal的属性。而这样的话,继承Animal里面的属性则是cat实例化对象共享的,new的两个对象的size属性都会指向原型链上Animal的size,故上上面代码的输出结果tom和peter的size都为同一个堆内存空间.下面给大家说一个坑点,刚学的小白不太熟悉的可能会踩坑。
function Animal() {
this.size = ['large', 'small'];
}
function Cat() {}
Cat.prototype = new Animal();
var tom = new Cat();
var peter = new Cat()
tom.size.push('aaa')
console.log(tom.size); // ["large", "small",'aaa']
console.log(peter.size); //["large", "small",'aaa']
由于上面的代码tom对象通过push修改了原型链上的size属性,所以tom和peter都会受到影响,这没有什么难理解的,请看下面的代码:
function Animal() {
this.size = ['large', 'small'];
}
function Cat() {}
Cat.prototype = new Animal();
var tom = new Cat();
var peter = new Cat()
tom.size = 1;
console.log(tom.size); // 1
console.log(peter.size); //["large", "small"]
上面的代码,tom把size赋值为1,只有tom对象里的size被修改了,peter里的size并没有受到影响,小白可能会疑惑,不是共享吗??原因在这里,如果使用了 = 赋值,则会在tom对象上var出一个新的size属性并且赋值为1,而这个属性是tom对象自己的,自然不会影响到peter的size属性。而如果使用push方法的话,tom会在自己的对象里寻找size属性,而tom是没有size属性的, 他的属性是通过原型链继承的,这个时候他会从他去原型链去寻找到 Animal 的size属性,并且修改他,而这个时候就会影响到两个对象