JavaScript Prototype 学习笔记
JavaScript中的每个对象都有一个原型(prototype),可以通过该原型来实现对象属性的继承。在JavaScript中,原型是一种特殊类型的对象,可以用来保存公共属性和方法。
原型链(Prototype Chain)
每个对象都有一个原型对象,同时原型对象也有自己的原型,因此形成了一个原型链。如果在当前对象中找不到某个属性或方法,则会从原型链上一直向上查找,直到找到为止。
构造函数(Constructor)
构造函数是一种特殊的函数,用于创建对象。在JavaScript中,构造函数通常以大写字母开头,例如 Object
、Array
、Function
等。
原型对象(Prototype Object)
在创建一个构造函数时,JavaScript会自动为这个构造函数创建一个原型对象(即 prototype 属性),原型对象中存储着该构造函数的公共属性和方法。
实例对象(Instance Object)
使用构造函数创建出来的对象就是实例对象,实例对象是基于原型对象创建的,并且具有原型对象中的所有属性和方法。
实例化(Instantiation)
创建一个实例对象的过程被称为实例化,可以通过 new
关键字来实现,例如:
javascriptCopy Codefunction Person(name) {
this.name = name;
}
var person1 = new Person('Tom');
var person2 = new Person('Jerry');
以上代码中,Person
就是一个构造函数,而 person1
和 person2
则是它的两个实例对象。
实例对象的属性和方法访问
实例对象可以通过 .属性名
或者 .方法名()
的方式来访问其属性或方法。如果当前对象找不到该属性或方法,则会从原型链上一直向上查找,直到找到为止。
例如:
javascriptCopy Codefunction 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 Codefunction 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 Codefunction 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
也是它的原型对象。