JavaScript的面向对象与其他言语的面向对象,其实有很大的区分。
JavaScript是基于原型的面向对象体系,而传统言语(比方java)的面向对象都是基于类的。
组织函数
function Person(name, age, job) {
this.age = age;
this.name = name;
this.job = job;
}
Person.prototype.sayName = function() {
console.log(this.name);
}
var cody = new Person('cody', '24', 'frontend');
cody.name;
cody.sayName();
在这个罕见的组织函数写法中,我们须要晓得以下几点:
1.Person
这个函数被定义后,会自带一个prototype
属性,这个属性指向一个对象,既原型对象,这个对象同时有一个constructor
属性,指向Person
Person.prototype = {
constructor: Person
}
注重的是,一切函数都有prototype
属性,并非只要组织函数才有。
2.cody
这个经由过程组织函数天生的对象,有一个__proto__
属性,它指向组织函数Person
的原型对象,既Person.prototype
接见cody.name
时,在它本身寻觅该属性,找到了,因而就返回该值。
接见cody.sayName
时,也是先在它本身寻觅该属性,然则没法找到,因而最先经由过程原型链向上寻觅: 寻觅cody.__proto__
,也就是Person.prototype
原型对象,发现了该属性,因而返回这个要领。
接见cody.toString
时,在Person.prototype
原型对象上也找不到,这时候,继续向上寻觅,既寻觅Person.prototype.__proto__
也就是Object.prototype
,在它上面,能够找到toString
继续
function Animal(name) {
this.name = name;
}
Animal.prototype.sayName = function() {
console.log(this.name);
}
function Duck(name, color) {
Animal.call(this, name);
this.color = color;
}
Duck.prototype = new Animal();
// 也能够优化成如许,削减一次父级组织函数挪用
// Duck.prototype = Object.create(Animal.prototype);
Duck.prototype.constructor = Duck;
Duck.prototype.sayColor = function() {
console.log(this.color);
}
var duck = new Duck('duck', 'yellow');
duck.sayColor();
duck.sayName();
前面我们说过,JS是基于原型的面向对象。所以,继续并不一定须要运用组织函数,我们能够基于一个已存在的对象,对这个对象举行继续。
var obj = {
name: 'cody',
say: function() {
console.log(this.name)
}
};
var sub = Object.create(obj);
sub.name = 'deepred';
sub.say(); // deepred
Object.create
的道理是:
Object.create = Object.create || function(obj) {
var F = function() {};
F.prototype = obj;
return new F();
}
ES6的class语法
ES6引入了class语法,让JS看起来更像是面向对象的言语,但这仅仅是语法糖罢了,背地仍然是基于原型的继续体式格局。
class Animal {
constructor(name) {
this.name = name;
}
sayName() {
console.log(this.name)
}
}
class Duck extends Animal {
constructor(name, color) {
super(name);
this.color = color;
}
sayColor() {
console.log(this.color);
}
sayName() {
// 挪用父级同名要领
super.sayName();
console.log('duck sayname')
}
}
var duck = new Duck('duck', 'red');
duck.sayColor();
duck.sayName();