- 前言
- 关于 ECMASCRIPT 发展史和现状
- ES6 带来的重大特性
- ES2016(ES7)的改进
- ES2017(ES8)带来的重大新特性
- ES2018(ES9)带来的重大新特性
- JavaScript 编码风格指南
- JavaScript 词法结构(构建块)
- JavaScript 变量
- JavaScript 数据类型
- JavaScript 表达式
- 原型继承
- 如何使用 JavaScript 中的 Classes(类)
- JavaScript 异常处理
- JavaScript 中的分号(;)
- JavaScript 中的引号
- JavaScript 字面量模板(Template Literals)指南
- JavaScript 中的 function(函数)
- JavaScript 箭头函数(Arrow Function)
- JavaScript 中的闭包(Closures)
- JavaScript 数组(Arrays)
- JavaScript 中的循环(Loops)
- JavaScript 中的事件(Events)
- JavaScript 中的事件循环(Event Loop)
- JavaScript 异步编程和回调
- 理解 JavaScript 中的 Promises
- 用 async 和 await 编写现代 JavaScript 异步代码
- JavaScript 中的 循环(Loops) 和 作用域(Scope)
- JavaScript 定时器 setTimeout() 和 setInterval()
- JavaScript 中的 this
- JavaScript 严格模式(Strict Mode)
- JavaScript 中的 立即执行函数表达式(IIFE)
- JavaScript 中的数学运算符
- JavaScript 中的 Math 对象
- 介绍 ES Modules(模块)
- 介绍 CommonJS
- JavaScript 术语表
原型继承
JavaScript 在流行的编程语言中非常独特,因为它使用了原型继承。 让我们找出这意味着什么。
虽然大多数面向对象的语言使用基于类的继承模型,但 JavaScript 基于原型继承模型。
这是什么意思呢?
每个 JavaScript 对象都有一个名为 prototype 的属性,它指向不同的对象。
这个不同的对象就是 对象原型 。
我们的对象使用该对象原型来继承属性和方法。
假设您使用对象字面量语法创建了一个对象:
const car = {}
或者使用 new Object() 语法创建:
const car = new Object()
在任何情况下, car 的 prototype(原型) 是 Object :
如果初始化一个数组,数组其实也是一个对象:
const list = [] //or const list = new Array()
这里 list 的 prototype(原型) 是 Array :
您可以通过检查 __proto__ getter 来验证这一点:
car.__proto__ == Object.prototype //true car.__proto__ == new Object().__proto__ //true list.__proto__ == Object.prototype //false list.__proto__ == Array.prototype //true list.__proto__ == new Array().__proto__ //true
我在这里使用 __proto__ 属性,这是历史遗留的非标准的语法,但在现代浏览器中广泛实现。获得原型的更可靠方法是使用 Object.getPrototypeOf(new Object()) ;例如:
const car = {}
const list = []
console.log(Object.getPrototypeOf(car));
console.log(Object.getPrototypeOf(list));
我们可以在控制台中看到,他们的 constructor 属性分别是 Object() 和 Array() ;

原型中的所有属性和方法对于拥有原型的对象都是可用的:

Object.prototype 是所有对象的基本原型:
Array.prototype.__proto__ == Object.prototype //true
如果你想知道 Object.prototype 的原型是什么,那就没有原型。 这是一种特殊的,独一无二的的对象。(❄️)
您看到的上面的示例是工作中的原型链的示例。
我可以创建一个对象来扩展 Array 的对象,和任何我用它实例化的对象,在其原型链中将包含 Array 和 Object ,并从所有祖先继承属性和方法。
除了使用 new 运算符创建对象,或使用对象和数组的字面量语法之外,还可以使用 Object.create() 实例化对象。
传递的第一个参数是用作原型的对象:
const car = Object.create({})
const list = Object.create(Array)
您可以使用 isPrototypeOf() 方法检查对象的原型:
Array.isPrototypeOf(list) //true Object.isPrototypeOf(list) //false
请注意,因为您可以使用以下方式实例化一个数组
const list = Object.create(Array.prototype)
在这种情况下, Array.isPrototypeOf(list) 为 false ,而 Array.prototype.isPrototypeOf(list) 为 true 。
关于 JavaScript prototype(原型) 的相关知识,可以查看 JavaScript Prototype(原型) 新手指南 详细了解。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论