3、JS原型继承传参及原型链

原型

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)

参考地址:https://www.cnblogs.com/ziChin/p/10040139.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值