什么是原型?
原型本质上也是一个对象,其他对象可以继承它的对象中的属性
js对象中有一个隐藏属性[[prototype]],这个属性就指向了原型对象,当我们想要使用对象中的某个属性的时候,而对象中却没有就会使用原型对象中的属性.
let man = {
walk(){
console.log(this.name)
}
}
let zy = {
name:"zy",
__proto__:man //在本例中man就是原型对象 __proto__作用是set get原型对象
}
注意原型对象也是对象,因此原型对象中的[[prototype]]属性也是指向一个原型对象
man.__proto__ //Object
man.__proto__.__proto__ //null Object的原型属性指向的是null
为什么要原型?
可以使我们少写点代码,代码结构上看着比较好,占用的内存也少
构造函数中的原型
在我们调用构造函数的时候,构造函数会为我们新建的对象中的[[prototype]]赋值(原型对象)
function Man(name){
this.name = name
}
let zy = new Man('zy')
zy.__proto__ //{constructor:Man(name)}
Man.prototype //{constructor:Man(name)}
//也就是说Man的prototype属性和zy的__proto__属性指向的是一个原型对象
//可以通过向Man.prototype中添加值 然后zy对象也会能够获取到这些值
Man.prototype.eat = function(food){
return `${this.name} like ${food} `
}
内置对象中的原型
小朋友你是否有很多疑问为什么原始值可以调用方法例如 ‘hello’.slice(0),这个过程略微有点繁琐.首先js引擎会将’hello’转化为对象 new String(‘hello’) 那么这个对象中又没有slice方法,别急…这个对象是由function String(){} 构造的 这个对象中有String.prototype.slice方法,因此我们的’hello’小可爱可以通过__proto__去自动的获得slice()方法.