原型的表现形式有两种,prototype和proto。prototype只有函数具有,普通对象是没有该属性的,而prototype指向原型对象的指针,原型对象包含该构造函数实例化出的所有对象共享的方法和属性。proto是作为对象时的共享的属性和方法。
function Title(){
console.log("Title")
}
console.dir(Title)
prototype—-作为构造函数的原型对象
function Title(){
}
Title.prototype.show=function(){
console.log("show")
}
//在prototype上定义的方法和属性会被作为实例化对象的原型__proto__
let hd = new Title()
hd.show()//show
console.log(hd.__proto__ == Title.prototype)//true
proto作为对象的原型对象
function Title(){
}
Title.prototype.show=function(){
console.log("prototype:show")
}
Title.show = function(){
console.log("__proto__:show")
}
let hd = new Title()
hd.show()//"prototype:show"
Title.show()//"__proto__:show"
原型中的constructor属性
constructor属性是构造函数中独有的,虽然普通函数和构造函数在本质上没什么区别,只是为了区分他们把构造函数的首字母大写了。constructor属性是函数prototype中的属性,他的作用通过他可以找到原来的构造函数。通过构造函数实例化的对象中的proto中的constructor也是指向创建他的构造函数
call、apply方法借用原型的方法
通过call和apply可以调用本来在自己原型链上没有函数来执行。
function Sum(){
this.sum1 = function(arr){
return arr.reduce((pre,cur)=>{
return pre+cur
},0)
}
}
let hd = new Sum()
//求a中的所有科目的总分
let a = {
lesson:{js:87,css:90,html:95},
get data(){
return Object.values(a.lesson)
}
}
console.log( hd.sum1.call(null,a.data) )//输出272
Object.create()
通过Object.create 方法可以创建对象,在这里有两个参数,第一个参数是对象,第二个参数是该对象的属性特征设置,这个方法可以拷贝对象,但是只能浅拷贝
Object.setPrototypeOf()
Object.setPrototypeOf()方法用于将指定对象的原型对象设置到一个新的对象或null上。