js原型,继承

96 阅读1分钟

1.原型

是function对象的一个属性prototype,定义了构造函数制作出对象的公共祖先

Preson.prototype = 

作用:提取共有属性

Preson.prototype.surname='张'
function Preson(name) {
	this.name = name
}
let p = new Preson('三')
let p1 = new Preson('四')
p.surname == p1.surname
p.name == '三'
p1.name == '四'

构造函数constructor 可修改

Preson.prototype.surname='张'
function Preson(name) {
	this.name = name
}
let p = new Preson('三')
console.log(p.constructor) //Preson()
Preson.prototype.constructor = function Tool(){}
console.log(p.constructor) //Tool()

对象的 __proto__ 可修改

Preson.prototype.surname='张'
function Preson() {
	/* new时隐式调用
     let this = {
     __proto__:Preson.prototype
     }
    */
}
let p = new Preson()
console.log(p.surname)  //张
p.__proto__ = {surname:'李'}
console.log(p.surname) //李

可以Object.create(原型|null)创建对象

2.原型链

当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,如果还没有找到就会再在构造函数的prototype的__proto__中查找这样一层一层向上查找就会形成一个链式结构,我们称为原型链 A instanceof B 判断A对象的原型上有没有B的原型 原型链中的方法this指向触发事件执行的对象

3.继承

1.原型链继承

原型链上属性共享

2.构造函数继承

有私有属性 只能继承父类的实例属性和方法 需要额外调用一次函数影响性能

function Preson( name ) {
	this.name = name
}
function Son( name,age ) {
	Preson.call(this,age)
	this.name = name
}
  1. 圣杯模式 有私有属性 可以继承选择继承对象的所有方法
const inherit = (function(){
            let F =function (){} ;//私有化
            return function(Target,Origin){
                F.prototype = Origin.prototype;
                Target.prototype.constructor =  Target;
                Target.prototype.uber = Origin.prototype;//继承对象的属性
            }
        }())
function Preson( name ) {
	this.name = name
}
function Preson1(  ) {
	
}
inherit(Preson1,Preson)
p = new Preson1('a')

4.class extends继承

目录