面向对象思想中,是将公共的、抽象的属性和方法提取出来,作为一个基类,子类继承这个基类,从而继承到这些属性和方法。Javascript函数是对象,每个函数都要非依赖的非继承自带的属性prototype
,prototype
是一个对象。而JavaScript中则可以通过prototype
属性来实现类似的作用--定义所有实例对象共享的属性和方法。
function Person(name, gender) {
this.name = name;
this.gender = gender;
this.sayHello = function() {
console.log('Hello,I am', this.name, '. I\'m a', this.gender);
};
}
var zs = new Person('zhang san', 'male'),
xh = new Person('xiao hong', 'female');
zs.sayHello(); // Hello,I am zhang san . I'm a male
xh.sayHello(); // Hello,I am xiao hong . I'm a female
zs.sayHello === xh.sayHello; // false
上述代码中,zs.sayHell
和xh.sayHello
是两个独立的对象。
function Person(name, gender) {
this.name = name;
this.gender = gender;
}
Person.prototype.sayHello = function() {
console.log('Hello,I am', this.name, '. I\'m a', this.gender);
};
var zs = new Person('zhang san', 'male'),
xh = new Person('xiao hong', 'female');
zs.sayHello(); // Hello,I am zhang san . I'm a male
xh.sayHello(); // Hello,I am xiao hong . I'm a female
zs.sayHello === xh.sayHello; // true
_proto_
:指向当前对象的原型对象,也就是构造函数的prototype属性。
constructor
:指向此prototype
对象所在的构造函数,可以通过这个属性来判断这个对象是由哪个构造函数产生的.)
zs
和xh
这两个通过Person
构造函数产生的对象,是可访问到Person
的prototype
属性的,所以我们定义在prototype
下的sayHello
方法,Person
的实例对象都可以访问到。
参考链接
http://www.jianshu.com/p/1160d65ce3c3
http://javascript.ruanyifeng.com/oop/prototype.html#toc3