• 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()
    
    请用今天的努力,让明天没有遗憾。
  • 相关阅读:
    分部视图
    linq的几个方法
    如何让服务器支持mp4文件下载和sqlserver将表生成为sql语句方法
    在asp.net mvc中导出Excel文件
    Linq2EF操作中的两个小问题
    JSON到底是什么?
    连接跟踪(conntrack):原理、应用及 Linux 内核实现 转载
    没有安全,没有隐私
    互联网发展到今天,我们要做的,是用机器解决人类解决不了的问题。在这个意义上,比起人工智能,机器智能这个词更加准确。
    今天,世界各国城市的可持续发展面临很大挑战,这些挑战也带来了一个难得的机遇,就是利用机器智能解决城市发展过程中许多重要的问题,如交通治理。同时这也是像机器智能这样的新一代技术快速发展的机遇,这正是我全身心推动城市大脑的原因
  • 原文地址:https://www.cnblogs.com/cupid10/p/13653988.html
Copyright © 2020-2023  润新知