zoukankan      html  css  js  c++  java
  • js对象的继承

    对象的继承

    面向对象编程很重要的一个方面,就是对象的继承。A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法。这对于代码的复用是非常有用的。

    方式一、原型链继承

    这种方式关键在于:子类型的原型为父类型的一个实例对象。

    //父类型
    function Person(name, age) {
    this.name = name,
    this.age = age,
    this.play = [1, 2, 3]
    this.setName = function () {}
    }
    Person.prototype.setAge = function () {}
    //子类型
    function Student(price) {
    this.price = price
    this.setScore = function () {}
    }
    Student.prototype = new Person() // 子类型的原型为父类型的一个实例对象
    var s1 = new Student(15000)
    var s2 = new Student(14000)
    console.log(s1,s2)
    方式二: 借用构造函数继承

    这种方式关键在于:在子类型构造函数中通用call()调用父类型构造函数

    function Person(name, age) {
    this.name = name,
    this.age = age,
    this.setName = function () {}
    }
    Person.prototype.setAge = function () {}
    function Student(name, age, price) {
    Person.call(this, name, age) // 相当于: this.Person(name, age)
    /*this.name = name
    this.age = age*/
    this.price = price
    }
    var s1 = new Student(‘Tom’, 20, 15000)
    方式三: 原型链+借用构造函数的组合继承

    这种方式关键在于:通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用。

    function Person (name, age) {
    this.name = name,
    this.age = age,
    this.setAge = function () { }
    }
    Person.prototype.setAge = function () {
    console.log(“111”)
    }
    function Student (name, age, price) {
    Person.call(this, name, age)
    this.price = price
    this.setScore = function () { }
    }
    Student.prototype = new Person()
    Student.prototype.constructor = Student//组合继承也是需要修复构造函数指向的
    Student.prototype.sayHello = function () { }
    var s1 = new Student(‘Tom’, 20, 15000)
    var s2 = new Student(‘Jack’, 22, 14000)
    console.log(s1)
    console.log(s1.constructor) //Student
    console.log(p1.constructor) //Person
    方式四、组合继承优化1

    这种方式通过父类原型和子类原型指向同一对象,子类可以继承到父类的公有方法当做自己的公有方法,而且不会初始化两次实例方法/属性,避免的组合继承的缺点。

    function Person (name, age) {
    this.name = name,
    this.age = age,
    this.setAge = function () { }
    }
    Person.prototype.setAge = function () {
    console.log(“111”)
    }
    function Student (name, age, price) {
    Person.call(this, name, age)
    this.price = price
    this.setScore = function () { }
    }
    Student.prototype = Person.prototype
    Student.prototype.sayHello = function () { }
    var s1 = new Student(‘Tom’, 20, 15000)
    console.log(s1)
    方式五: 组合继承优化2

    借助原型可以基于已有的对象来创建对象,var B = Object.create(A)以A对象为原型,生成了B对象。B继承了A的所有属性和方法。

    function Person (name, age) {
    this.name = name,
    this.age = age
    }
    Person.prototype.setAge = function () {
    console.log(“111”)
    }
    function Student (name, age, price) {
    Person.call(this, name, age)
    this.price = price
    this.setScore = function () { }
    }
    Student.prototype = Object.create(Person.prototype)//核心代码
    Student.prototype.constructor = Student//核心代码
    var s1 = new Student(‘Tom’, 20, 15000)
    console.log(s1 instanceof Student, s1 instanceof Person) // true true
    console.log(s1.constructor) //Student
    console.log(s1)
    方式六、ES6中class 的继承

    ES6中引入了class关键字,class可以通过extends关键字实现继承,还可以通过static关键字定义类的静态方法,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多。

    ES5 的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面(Parent.apply(this))。ES6 的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到this上面(所以必须先调用super方法),然后再用子类的构造函数修改this。

    需要注意的是,class关键字只是原型的语法糖,JavaScript继承仍然是基于原型实现的。

    class Person {
    //调用类的构造方法
    constructor(name, age) {
    this.name = name
    this.age = age
    }
    //定义一般的方法
    showName () {
    console.log(“调用父类的方法”)
    console.log(this.name, this.age);
    }
    }
    let p1 = new Person(‘kobe’, 39)
    console.log(p1)
    //定义一个子类
    class Student extends Person {
    constructor(name, age, salary) {
    super(name, age)//通过super调用父类的构造方法
    this.salary = salary
    }
    showName () {//在子类自身定义方法
    console.log(“调用子类的方法”)
    console.log(this.name, this.age, this.salary);
    }
    }
    let s1 = new Student(‘wade’, 38, 1000000000)
    console.log(s1)
    s1.showName()
    请用今天的努力,让明天没有遗憾。
  • 相关阅读:
    伟景行 citymaker 从入门到精通(2)——工程图层树加载
    伟景行 citymaker 从入门到精通系列
    伟景行 citymaker 从入门到精通(1)——js开发,最基本demo,加载cep工程文件
    Android手机屏幕投射到电脑神器Vysor
    GeoTools坐标转换(投影转换和仿射变换)
    微信开发系列(1):企业号回调模式认证
    通过扩大IE使用内存,解决skyline在IE下模型不能加载的方法
    SDE ST_Geometry SQL st_intersects查询很慢的解决方法
    axTE3DWindowEx双屏对比控件白屏解决方法以及网上方法的校正(CreateControlOveride)
    namespace使用方法
  • 原文地址:https://www.cnblogs.com/cupid10/p/15617662.html
Copyright © 2011-2022 走看看