【学习 JavaScript】 JavaScript 教程 JavaScript 简介 JavaScript 用法 JavaScript Chrome 中运行 JavaScript 输出 JavaScript 语法 JavaScript 语句 JavaScript 注释 JavaScript 变量 JavaScript 数据类型 JavaScript 对象 JavaScript 函数 JavaScript 作用域 JavaScript 事件 JavaScript 字符串 JavaScript 字符串模板 JavaScript 运算符 JavaScript 比较 JavaScript 条件语句 JavaScript switch 语句 JavaScript for 循环 JavaScript while 循环 JavaScript break 和 continue 语句 JavaScript typeof JavaScript 类型转换 JavaScript 正则表达式 JavaScript 错误 JavaScript 调试 JavaScript 变量提升 JavaScript 严格模式 JavaScript 使用误区 JavaScript 表单 JavaScript 表单验证 JavaScript 验证 API JavaScript 保留关键字 JavaScript this JavaScript let 和 const JavaScript JSON JavaScript void JavaScript 异步编程 JavaScript Promise JavaScript 代码规范 JS 函数 JavaScript 函数定义 JavaScript 函数参数 JavaScript 函数调用 JavaScript 闭包 JS 类 JavaScript 类 JavaScript 类继承 JavaScript 静态方法 JS HTML DOM DOM 简介 DOM HTML DOM CSS DOM 事件 DOM EventListener DOM 元素 HTMLCollection 对象 NodeList 对象 JS 高级教程 JavaScript prototype JavaScript Number 对象 JavaScript String JavaScript Date(日期) JavaScript Array(数组) JavaScript Boolean(布尔) JavaScript Math(算数) JavaScript RegExp 对象 JS 浏览器BOM JavaScript Window JavaScript Window Screen JavaScript Window Location JavaScript Window History JavaScript Navigator JavaScript 弹窗 JavaScript 计时事件 JavaScript Cookie JS 库 JavaScript 库 JavaScript 测试 jQuery JavaScript 测试 Prototype JS 实例 JavaScript 实例 JavaScript 对象实例 JavaScript 浏览器对象实例 JavaScript HTML DOM 实例 JavaScript 总结 JS 参考手册

JavaScript Prototype 学习笔记

JavaScript中的每个对象都有一个原型(prototype),可以通过该原型来实现对象属性的继承。在JavaScript中,原型是一种特殊类型的对象,可以用来保存公共属性和方法。

原型链(Prototype Chain)

每个对象都有一个原型对象,同时原型对象也有自己的原型,因此形成了一个原型链。如果在当前对象中找不到某个属性或方法,则会从原型链上一直向上查找,直到找到为止。

构造函数(Constructor)

构造函数是一种特殊的函数,用于创建对象。在JavaScript中,构造函数通常以大写字母开头,例如 ObjectArrayFunction 等。

原型对象(Prototype Object)

在创建一个构造函数时,JavaScript会自动为这个构造函数创建一个原型对象(即 prototype 属性),原型对象中存储着该构造函数的公共属性和方法。

实例对象(Instance Object)

使用构造函数创建出来的对象就是实例对象,实例对象是基于原型对象创建的,并且具有原型对象中的所有属性和方法。

实例化(Instantiation)

创建一个实例对象的过程被称为实例化,可以通过 new 关键字来实现,例如:

javascriptCopy Code
function Person(name) { this.name = name; } var person1 = new Person('Tom'); var person2 = new Person('Jerry');

以上代码中,Person 就是一个构造函数,而 person1person2 则是它的两个实例对象。

实例对象的属性和方法访问

实例对象可以通过 .属性名 或者 .方法名() 的方式来访问其属性或方法。如果当前对象找不到该属性或方法,则会从原型链上一直向上查找,直到找到为止。

例如:

javascriptCopy Code
function Person(name) { this.name = name; } Person.prototype.sayHi = function() { console.log('Hi, my name is ' + this.name); }; var person = new Person('Tom'); person.sayHi(); // Hi, my name is Tom

以上代码中,sayHi 是定义在原型对象中的方法,而 person 这个实例对象就可以通过 .sayHi() 来调用该方法。

实例对象的原型对象访问

每个实例对象都有一个 __proto__ 属性,该属性指向该实例对象的原型对象。

例如:

javascriptCopy Code
function Person(name) { this.name = name; } Person.prototype.sayHi = function() { console.log('Hi, my name is ' + this.name); }; var person = new Person('Tom'); console.log(person.__proto__ === Person.prototype); // true

以上代码中,person.__proto__ 就指向了 Person 的原型对象,即 Person.prototype

实例对象的原型属性和方法访问

实例对象可以通过 .constructor 属性来访问其构造函数,同时也可以通过 .constructor.prototype 属性来访问其原型对象。

例如:

javascriptCopy Code
function Person(name) { this.name = name; } Person.prototype.sayHi = function() { console.log('Hi, my name is ' + this.name); }; var person = new Person('Tom'); console.log(person.constructor === Person); // true console.log(person.constructor.prototype === Person.prototype); // true

以上代码中,person.constructor 就指向了 Person 这个构造函数,同时 person.constructor.prototype 也是它的原型对象。