- 1.既然我们可以使用构造函数就可以定义属性和方法,为什么还要原型呢??
一般每个实例的属性是不一样的,而行为一般都是一样的,所以我们希望每次实例化的时候,只分配内存保存不一样的数据,所有的实例共享这些方法,那就需要原型对象
原型对象本质: 原型对象的属性和方法可以被所有实例共享
这样,如果我们需要修改所有实例中的属性或者方法,就只需要修改一处,就能够影响到所有实例了。一般将大家都公有的东西放在原型对象中 每个实例独特的不一样的属性放在构造函数中
属性屏蔽理论:因为当我们调用一个函数的方法和属性时,先在函数本身里面寻找,找不到就会在函数的原型对象里寻找,如果原型对象中和构造函数中有相同的属性的话,就会显示构造函数中的属性。
我们想访问原型中的被屏蔽掉的属性有两种方法:
1.delete
2.使用Product.prototype.属性或者方法名称
function Product(){
this.name='神仙';
this.description = ''
this.buy = function(){
alert('构造函数对象')
}
}
Product.prototype={
name:'魔鬼',
buy:function(){
alert('原型对象')
}
}
var product = new Product()
console.log(product.name) // 神仙
/*清除构造函数中的name*/
delete product.name // 清除后显示原型对象中的name属性
console.log(product.name) // 魔鬼
product.name='魔鬼2' // 再次给name赋值
console.log(product.name) // 魔鬼2
/*没有清除之前,也可以用这种Product.prototype.buy()式来获取原型方法*/
product.buy(); // 构造函数对象
Product.prototype.buy(); // 原型对象
console.log(product.buy) // function (){alert('构造函数对象')}
/*清除*/
delete product.buy
console.log(product.buy) //function (){alert('原型对象')}
product.buy(); // 原型对象
通过原型创建对象,其实创建的是两个对象 构造函数对象 原型对象
当我们实例化的时候,该实例自动拷贝构造函数的所有属性和方法,而对于原型对象,则不拷贝,而是通过一个属性‘铁链’.那么既然实例不拷贝原型中的属性方法,如何访问到其属性呢??
隐藏的两个属性:
contructor,其值是构造函数属性访问搜索法则:
首先遍历自己的属性(从构造函数拷贝过来的属性),如果找到就返回
如果没找到,就根据铁链寻找到原型对象,依次遍历原型对象中的属性,如果找到同名的属性就返回,就这么简单。(原型链)实例属性和原型属性判断
hasOwnProperty() 方法
可以判定一个属性是存在于构造对象的实例上还是原型对象上。该 方法继承自 Object。
如果是实例对象—ture
如果是原型对象 – false引用类型和值类型区别
内存分配机制不一样
引用类型:创建一个变量—内存中保存的是变量真实入口的地址
值类型:创建一个变量,内存创建一个区域 说白了就是引用类型会分配两个区域:一个保存地址,一个保存内容变量赋值是否的区别
将一个值类型赋值给另一个变量,实际上新创建一个区域 引用类型,只是创建一个区域,保存另一个变量的入口地址