Skip to main content

Command Palette

Search for a command to run...

Es5原型与继承

Published
1 min readView as Markdown

prototype:函数对象的原型对象(普通对象)

__proto__:指向创建它的构造函数的原型对象

原型链的连接是实例(car1)和构造函数(Car)的原型对象(Car.prototype)之间,而不是实例和构造函数之间

构造函数式继承

  • 可以子传父
  • 引用类型的值相互独立
  • 父类构造函数重复执行,每次创建子类实例都会调用一次
  • 脱离于原型链,父类原型链上的方法属性无法继承
function Car(name,price){
    this.name = name;
    this.price = [price];
}
Car.static = 'static';
Car.prototype.showName = function(){
    return this.name;
}
Car.prototype.tools={
    a:1,
    b:2
}
function ElectricCar(name,speed,price){
    Car.call(this,name,price);
    this.speed = speed;
}
let car1 = new ElectricCar('特斯拉',180,80);
let car2 = new ElectricCar('wei',160,90);

组合式继承

  • 可以子传父
  • 自身引用类型的值相互独立
  • 实现了对原型链上的方法参数的继承
  • 父类构造函数重复执行
  • 原型链上的引用类型的值还是浅拷贝
function Car(name,price){
    this.name = name;
    this.price = [price];
    console.log(1);
}
Car.static = 'static';
Car.prototype.showName = function () {
    return this.name;
}
Car.prototype.tools = {
    a:1,
    b:2
}
function ExtendsFrom(sup,sub){
    function F(){}
    F.prototype=sup.prototype;
    sub.prototype = new F();
    sub.prototype.constructor = sub;
}
function ElectricCar(name,speed,price){
    Car.call(this,name,price);
    this.speed = speed;
}
ExtendsFrom(Car,ElectricCar);
let car1 = new ElectricCar('特斯拉',180,80);
let car2 = new ElectricCar('特斯拉2',160,90);

改进

  • 父类构造函数只执行一次
function Car(name,price){
    this.name = name;
    this.price = [price];
    console.log(1);
}
Car.static = 'static';
Car.prototype.showName = function () {
    return this.name;
}
Car.prototype.tools = {
    a:1,
    b:2
}
function ElectricCar(name,speed,price){
    Car.call(this,name,price);
    this.speed = speed;
}
ElectricCar.prototype = Object.create(Car.prototype);
//ElectricCar.prototype.__proto__ == Car.prototype
ElectricCar.prototype.constructor = ElectricCar;
let car1 = new ElectricCar('特斯拉',180,80);
let car2 = new ElectricCar('特斯拉2',160,90);

More from this blog

前端模块化与包管理器

什么是模块化? 将一个复杂的程序依据一定的规则封装成几个块文件,并进行组合。 模块化特点 模块中数据与实现是私有的,只向外部暴露一些接口方法与其他模块通信 模块化历程 全局function function util1(){ //... } function util2(){ //... } 引入js文件,这样会污染到全局。当时使用命名空间优化这个问题,引入一个工具对象(不私有) 闭包 向window对象添加全局属性 (function (win){ ...

Oct 15, 20213 min read

抽象语法树相关

抽象语法树 大多数编译器分为三个主要阶段:解析,转换和代码生成 解析正在获取原始代码并将其转换为更抽象的代码 代码的表示形式。 转换采取这种抽象表示并操纵去做 编译器想要的任何东西。 代码生成采用代码的转换表示形式, 将其转换为新代码。 解析 解析通常分为两个阶段:词法分析和句法分析。 词法分析提取原始代码并将其拆分为标记器(或词法分析器)的事物称为标记。 标记器是由微小的小物体组成的数组,描述了一个孤立的片断的语法。它们可以是数字,标签,标点符号,运算符,任何。 句法分...

Oct 15, 20215 min read
K

kc‘s blog

9 posts