JavaScript基于原型的编程语言,自己并不包含内置的类实现。可是能够经过Javascript模拟出类java
JavaScript中有构造函数和New运算符。构造函数用来实例对象和初始化属性。任何JavaScript函数均可以用做构造函数,构造函数必须使用new运算符做为前缀来建立新的实例编程
JavaScript要模拟一个类能够直接使用函数function编程语言
var Person = function(name){ this.name = name; } //实例化Person var alice = new Person('alice'); console.log(alice.name);
这里须要注意的this关键字, new运算符会改变函数的执行上下文,同时改变return的行为。当使用new运算符来调用构造函数时,执行上下文this从全局对象编程一个空的上下文,这个上下文表明新生成的实例。所以this指向当前建立的实例。函数
因此一下代码执行会出现undefinedthis
var bob = Person('bob'); console.log(bob.name);
JavaScript自己是基于原型的编程语言,原型的做用:区别类和实例spa
var Animal = function(){} Animal.run = function(){ console.log('Animal run') } Animal.prototype.breath = function(){ console.log('animal breath'); } Var Dog = function(){} //Dog继承自Animal Dog.prototype = new Animal(); Dog.prototype.wag = function(){ console.log('dog wag'); } var dog = new Dog(); dog.wag(); dog.breath();//继承的属性
输出:prototype
dog wag animal breath
那么经过类的prototype定义的方法或者属性就能够叫作全部实例的方法或属性,而其余的方法和属性就是类自己的方法和属性类比java类中的静态变量code
这里对下面一些东西的叫法约定一下对象
一般按照我的习惯继承
构造函数/匿名函数
var Person = function(name){ this.name=name; }
函数/类
function Person(){}
对象/实例
var person = { name:'zhangsan',sex:'male'}
仍是上面关于Animal和Dog的例子,咱们作一些改造
var animal = { breath:function(){console.log('animal breath!')}, }; var Dog = function(){} //Dog继承自animal Dog.prototype = animal; Dog.prototype.wag = function(){ console.log('dog wag'); } var dog = new Dog(); dog.wag(); dog.breath();//继承的属性
结果和上面的同样
在一个例子中咱们使用 Dog.prototype = new Animail; 这个例子中咱们使用的是Dog.prototype = animal
区别在于第一个例子中的Animal是一个匿名类,经过调用new运算符调用其构造函数返回了一个animal实例,而第二个例子中animal自己就已是一个实例/对象。这就是以前提到的new运算符的做用。
因此一个类的若是要继承另外一个类那么就须要继承那个类的实例而不是类自己(Function),固然咱们能够试一下直接使用Dog.prototype=Animal,结果就是当调用dog.breath();时直接返回的是一个Function对象,没法达到共享属性的意义。
原型对象就是一个“模板”,定义在原型上的属性被用来初始化一个新的对象。任何对象均可以做为一个对象的原型对象,以此来共享属性。