七、原型和原型链
JavaScript是一门支持面向对象编程的语言,它的函数是第一公民,同时也拥有类的概念。不同于传统的基于类的继承,JavaScript的类和继承是基于原型链模型的。在ES2015/ES6中引入了class关键字,但其本质仍然是基于原型链的语法糖。
proto
1.原型(Prototype)
原型(Prototype)是JavaScript中对象的一个特殊属性,它用于实现属性和方法的继承。在JavaScript中,每个对象都有一个原型属性,它指向另一个对象,这个对象被称为原型对象。通过原型链,对象可以从原型对象继承属性和方法。
原型的概念可以用以下方式解释:每个JavaScript对象都是基于一个构造函数创建的,构造函数是对象的模板或蓝图。在创建对象时,构造函数会创建一个关联的原型对象,对象通过原型链继承原型对象上的属性和方法。原型对象是一个普通的JavaScript对象,它具有自己的属性和方法。
让我们以一个示例来说明原型的概念和作用:
// 构造函数function Person(name) { this.name = name;} // 在原型对象上添加方法Person.prototype.sayHello = function() { console.log("Hello, my name is " + this.name);}; // 创建实例var person1 = new Person("John");var person2 = new Person("Alice"); // 调用原型对象上的方法 person1.sayHello(); // 输出: "Hello, my name is John" person2.sayHello(); // 输出: "Hello, my name is Alice"
在这个示例中,我们定义了一个构造函数Person,它有一个name属性。然后,我们通过给原型对象Person.prototype添加一个sayHello方法,使得所有通过Person构造函数创建的实例都可以访问该方法。我们创建了两个实例person1和person2,并分别调用了sayHello方法。
原型的重要性体现在以下几个方面:
- 继承:原型链允许对象继承其原型对象上的属性和方法。通过原型链,子对象可以访问和复用父对象的属性和方法,实现了继承的概念。
- 代码复用和共享:通过将方法和属性定义在原型对象上,可以实现多个对象共享相同的方法和属性。这样可以节省内存空间,提高性能,同时也方便了代码的维护和扩展。
下面是一个简单的原型链示意图:
+----------------------+ | Object.prototype | +----------------------+ ^ | +----------------------+ | Constructor.prototype | +----------------------+ ^ | +----------------------+ | Object instance | +----------------------+
在这个示意图中,Object.prototype是所有对象的原型,Constructor.prototype是构造函数的原型,Object instance是基于构造函数创建的对象实例。
带你读《现代Javascript高级教程》七、原型和原型链(2)https://developer.aliyun.com/article/1349649?groupCode=tech_library