原型
prototype
添加原型属性
__proto__
用于修改和获取 原型 属性
__proto__和prototype的区别
Object.prototype.isPrototypeOf(object)
方法用于测试一个对象是否存在于另一个对象的原型链上。
传参 :call(this,name,age) apply(this,[])
//原型
function Person(){
}
Person.prototype.name = 'Tina'
Person.prototype.age = 26
Person.prototype.action = function(){
return this.name
}
//实例化
var person1 = new Person()
person1.__proto__.name = 'zhangting' // 修改原型属性
person1.age = 20 //修改该实例属性
var person2 = new Person()
console.log(person2.name) // zhangting
console.log(person1.action()) // zhangting
console.log(person1.age) // 20
console.log(person2.age) // 26
//检查当前实例是否属于某一个原型
console.log(Person.prototype.isPrototypeOf(person1)) //true
混合使用构造函数和原型
//构造函数缺点:new多少次就会创建多少次这个构造函数,造成内存泄漏,性能变差
function Person(name,age) {
this.name = name
this.age = age
/*this.action = function() {
return this.name
}*/
}
Person.prototype.action = function() {
// return this.name //放公共的
return '姓名:' + this.name + '年龄:' + this.age
}
var person1 = new Person('Tina',26)
var person2 = new Person()
继承
//继承分 接口继承和实现继承,但es只支持实现继承
/*原型*/
function A() {}
A.prototype.like = function () {console.log('333')}
function B() {}
B.prototype = new A() // B继承原型A的所有属性
/*实例化*/
var bb = new B()
bb.like() // 333
bb.__proto__.like() //333
扩展1
/*原型*/
function A() {}
A.prototype.like = function () {console.log('333')}
function B() {}
B.prototype = new A()// B继承原型A的所有属性
B.prototype.like = function () {console.log('222')}
/*实例化*/
var bb = new B()
bb.like() //222
bb.__proto__.like() //222
//PS:找实例,找原型,找父项
扩展2
/*原型*/
function A() {}
A.prototype.like = function () {console.log('333')}
function B() {this.like = function () {console.log('222')}}
B.prototype = new A()// B继承原型A的所有属性
/*实例化*/
var bb = new B()
bb.like() //222
bb.__proto__.like() //333
//PS:找实例,找原型,找父项
扩展3
/*原型*/
function A() {}
A.prototype.like = function () {console.log('333')}
function B() {this.like = function () {console.log('222')}}
B.prototype = new A()// B继承原型A的所有属性
/*实例化*/
var bb = new B()
bb.like = function(){
console.log('111')
}
bb.like() //111 实例
bb.__proto__.like() //333 父项
//PS:找实例,找原型,找父项
原型链
由继承而形成的关系链就叫做原型链
传参
/*
在一个对象中调用另一个对象,this指的是作用域
call(this,name,age)
apply(this,[])
*/
function Parent(name, age) {
this.name = name;
this.age = age;
}
Parent.prototype.getParentName = function() {
return this.name
}
function Son() {
Parent.call(this,'call son',20) //子类调用父类并传参
}
Son.prototype = new Parent()
Son.prototype.getSonName = function(){
return this.name
}
var ss = new Son()
console.log(ss.name)
console.log(ss.age)