js对原型和继承的理解

在JavaScript中,原型(Prototype)和继承是实现对象间共享特性和行为的两个核心概念。理解原型和继承对于编写高效和可维护的代码至关重要。

原型(Prototype)

原型是一个基础概念,JavaScript中每个对象都有一个原型对象,而从原型对象可以继承方法和属性。原型对象本身也是一个普通的对象,但其用途主要是作为一个共享的模板,其他对象可以利用它作为一个引用模板来获取共享的属性或方法。

在JavaScript中,所有通过对象字面量创建的对象都隐式地有一个 Object.prototype作为它们的原型。这就意味着它们可以访问 Object.prototype上定义的所有方法,如 toString()和 hasOwnProperty()

let myObject = {
    name: 'JavaScript'
};
console.log(myObject.hasOwnProperty('name')); // 输出: true

构造函数和原型属性

JavaScript通过构造函数模式来创建一个类似与“类”的结构,构造函数用于创建特定类型的对象。每个构造函数都有一个原型对象,它的所有实例将从这个原型对象继承属性和方法。

function Person(name) {
    this.name = name;
}

Person.prototype.sayHello = function() {
    console.log('Hello, my name is ' + this.name);
};

let person1 = new Person('Alice');
person1.sayHello(); // 输出: Hello, my name is Alice

在这个例子中,Person的所有实例都可以访问 sayHello方法,因为 sayHello方法被定义在 Person.prototype上。

继承

继承在JavaScript中通常是通过原型链来实现的。原型链是对象和原型之间的链接,一个对象的属性或方法可以沿着原型链向上查找,直到找到为止。

function Programmer(name, language) {
    Person.call(this, name);
    this.language = language;
}

Programmer.prototype = Object.create(Person.prototype);
Programmer.prototype.constructor = Programmer;

Programmer.prototype.code = function() {
    console.log('I am coding in ' + this.language);
};

let programmer1 = new Programmer('Bob', 'JavaScript');
programmer1.sayHello(); // 输出: Hello, my name is Bob
programmer1.code(); // 输出: I am coding in JavaScript

在上述代码中,Programmer继承了 Person。我们设置 Programmer.prototype为 Person.prototype的一个实例,创建了一个原型链。现在,Programmer的实例就可以访问在 Person原型上定义的 sayHello方法了,同时 Programmer也定义了自己的 code方法。

ES6引入的类语法让继承变得更加清晰和易于理解,但在底层,这依然是使用原型链来实现的。

class Person {
    constructor(name) {
        this.name = name;
    }
    sayHello() {
        console.log(`Hello, my name is ${this.name}`);
    }
}

class Programmer extends Person {
    constructor(name, language) {
        super(name);
        this.language = language;
    }
    code() {
        console.log(`I am coding in ${this.language}`);
    }
}

let programmer1 = new Programmer('Eve', 'Python');
programmer1.sayHello(); // 输出: Hello, my name is Eve
programmer1.code(); // 输出: I am coding in Python

在使用class关键词时,继承通过 extends关键词指定,super()函数用于调用父类的构造函数。尽管语法更接近传统面向对象编程语言,但其背后原理仍然是基于JavaScript中的原型和原型链的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值