JavaScript原型模式
1. 普通对象
var o1 = {}
var o2 = new Object()
var o3 = new f1()
除了函数对象就是普通对象
2. 函数对象
function f1(){}
var f2 = function(){}
var f3 = new Function()
函数对象本质上都是通过new Function()创造的
JavaScript内置有12个构造器/对象
Number、Boolean、String、Object、Function、Array、RegExp、Error、Date、Global、Arguments、Math、JSON
Global不能直接访问,Arguments仅在函数调用时由JS引擎创建,Math,JSON是以对象形式存在
的,无需new。它们的proto是Object.prototype
Inner.__proto__ === Function.prototype
Inner.constructor == Function
所有函数对象的__proto__都指向Function.prototype,它是一个空函数(Empty function)
f(){[native code]}
3. 构造函数
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() { alert(this.name) }
}
var p1 = new Person('Zaxlct', 28, 'Software Engineer');
var p2 = new Person('Mick', 23, 'Doctor');
p1、p2都是构造函数Person的实例,p1、P2的constructor属性指向构造函数Person
4. 原型对象
每个对象都有__proto__属性,但只有函数对象才有prototype属性
// 构造函数
function Person() {}
Person.prototype.name = 'Zaxlct';
Person.prototype.age = 28;
Person.prototype.job = 'Software Engineer';
Person.prototype.sayName = function() {
alert(this.name);
}
// 原型对象
Person.prototype = {
name: 'Zaxlct',
age: 28,
job: 'Software Engineer',
sayName: function() {
alert(this.name);
}
}
原型对象是一个普通对象,Person.prototype就是原型对象
var A = new Person();
Person.prototype = A;
原型对象(Person.prototype)是构造函数(Person)的一个实例
5. __proto__
JS在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__ 的内置属性,用于指向创建它的构造函数的原型对象
person1.__proto__ == Person.prototype
6. 构造器
构造函数(Object)本身就是一个函数(就是上面说的函数对象),它和上面的构造函数 Person 差不多。只不过该函数是出于创建新对象的目的而定义的。
7. 原型链
person1.__proto__ = Pserson.prototype
Person.__proto__ = Function.prototype
Person.prototype.__proto__ = Object.prototype
Object.__proto__ = Function.prototype
Object.prototype.__proto__ = null
8. prototype
Function.prototype是唯一一个typeof XXX.prototype为function的prototype,其它的构造器的prototype都是一个对象。
实例和原型对象存在一个连接,这个连接存在于实例与构造函数的原型对象之间,而不是存在于实与构造函数之间。