Javascript原型

javascript
Thu Aug 16 2018 11:39:21 GMT+0000 (UTC)

构造函数、原型对象和实例的关系:

每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。

  • 每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。prototype就是通过调用构造函数而创建的那个对象实例的原型对象。
  • 在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。
  • 当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象。这个链接存在于实例与构造函数的原型对象之间,而不是存在于实例与构造函数之间。
//构造函数
function Person(name){
	this.name = name || '001';
	this.sayHello = function(){
		console.log('hello, my name is '+ this.name);
	}
}

//构造函数的原型对象Person.prototype
Person.prototype.sayWorld = function(){
	console.log('hello world');
}

//构造函数的实例
var jim = new Person('jim');
jim.sayWorld();
jim.sayHello();

var peng = new Person('peng');
peng.sayWorld();
peng.sayHello();

//[构造函数的原型对象] 与 [构造函数] 的联系 
Person.prototype.constructor === Person //true

//[实例] 与 [构造函数的原型对象] 的联系
Person.prototype.isPrototypeOf(jim) //true
Person.prototype.isPrototypeOf(peng) //true

# Object.getPrototypeOf()返回的对象实际就是这个对象的原型
Object.getPrototypeOf(jim) === Person.prototype //true
Object.getPrototypeOf(peng) === Person.prototype //true
Object.getPrototypeOf(jim).name // undefined
Object.getPrototypeOf(jim).sayWorld() // hello world

# hasOwnProperty方法可以检测一个属性是存在于实例中,还是存在于原型中
jim.hasOwnProperty('name')     //true
jim.hasOwnProperty('sayHello') //true
jim.hasOwnProperty('sayWorld') //false