当前栏目
JavaScript 原型和原型链
JavaScript 是一种基于原型继承的语言。在 JavaScript 中,对象是通过原型链来继承属性和方法的。
一、原型
每一个对象都有一个 proto 属性,该属性指向该对象的原型。原型本质上也是一个对象,所有的对象都拥有一个原型,除了 Object.prototype。
JavaScript 中有一个 Object.create() 方法可以用来创建一个新对象,并且可以指定该对象的原型。
例如:
let obj1 = {
name: "object1",
sayName: function() {
console.log(this.name);
}
};
let obj2 = Object.create(obj1);
console.log(obj2.name); // "object1"
obj2.sayName(); // "object1"
在上面代码中,obj2 是通过 obj1 创建的,obj2 的原型是 obj1,所以 obj2 可以继承 obj1 的属性和方法。
二、原型链
原型链是一种链式结构,它描述了对象与其原型之间的关系。当对象访问一个属性或方法时,如果在自身中找不到,就会在其原型中寻找,如果在原型中还找不到,就会继续在原型的原型中寻找,直到找到为止或者到达原型链的顶端(Object.prototype)。
在 JavaScript 中,原型链的顶端是 Object.prototype,它是所有对象的根原型。Object.prototype 上面没有原型了。
同时原型链也可能会出现循环引用的情况,所以在使用原型链时需要注意避免这种情况。
JavaScript 中的原型和原型链是 JavaScript 中非常重要的一部分,它们是 JavaScript 继承的基础。在 JavaScript 中,所有的对象都是通过原型继承来继承属性和方法的,这样能够节省内存空间和提高代码复用性。
三、继承
对于 JavaScript 的继承来说,原型链是其中一种常用的方式,还有一种是 ES6 中新增的类和继承的概念。
ES6 中的 class 和 extends 关键字可以用来定义类和继承。这种方式和原型链继承本质上是一样的,只是语法上更加类似传统面向对象语言。
例如:
class Parent {
constructor(name) {
this.name = name;
}
sayName() {
console.log(this.name);
}
}
class Child extends Parent {
constructor(name, age) {
super(name);
this.age = age;
}
sayAge() {
console.log(this.age);
}
}
let child = new Child("Bob", 10);
child.sayName(); // "Bob"
child.sayAge(); // 10
在上面的代码中,使用 class 和 extends 关键字定义了一个父类 Parent 和一个子类 Child。Child 类继承了 Parent 类,也就是说 Child 对象可以继承 Parent 对象的属性和方法。
constructor
是类的构造函数,在使用 new
创建类的实例时会调用该函数。在子类中,使用 super(name)
调用父类的构造函数,这样可以继承父类的属性。
在子类中可以添加新的属性和方法,例如 sayAge 方法,这样就实现了对父类的继承和扩展。
JavaScript 的原型链和 ES6 中的 class 和 extends 都是实现继承的方式。其中原型链继承更加灵活,对于继承和扩展都比较方便,但是语法上比较麻烦。而 class 和 extends 的语法更加类似传统面向对象语言,更加易于理解,但是在继承和扩展上比较限制。
相关文章
- TiDB Binlog 组件正式开源
- 使用Visual Studio Code对Node.js进行断点调试
- 推荐!数据可视化的十种优秀JavaScript图表库
- Node.js在复杂集成场景下占据统治地位的五个理由
- 玩转Node.js单元测试
- Node.js中内存泄漏分析
- Angular对React:一场关于Web开发者支持率的史诗对决
- 热点推荐:什么是后端开发?
- 谈谈Spring boot 启动层面的开发
- 使用NodeJS将文件或图像上传到服务器
- 编写React组件的最佳实践
- JavaScript MV*框架最值得关注的七个亮点
- 前端开发指南:如何利用PHP Cake框架构建应用
- 基于React与Vue后,移动开源项目Weex如何定义未来
- NodeJS和C++之间的类型转换
- jQuery中的常用到的三十九个技巧
- 官宣|Google Developers中国网站发布!
- NodeJS和C++之间的类型转换
- .NET Core首例Office开源跨平台组件(NPOI Core)
- 如何写出漂亮的React组件