以前一直觉得构造函数能够直接访问原型方法,是错的,如今说一下javascript
构造函数中this上添加的成员 ,在Cat构造方法里面,定义在this中的变量和方法,只有实例才能访问到:如this.name,this.move,this.eat这些都是实例拥有,没法经过Cat直接调用。java
function Cat(name){ this.name = name this.move = function() { console.log('移动') } this.eat = function() { console.log(`${this.name}爱吃鱼`) } } //给Cat构造函数添加静态方法 Cat.eat = function() {console.log(`${this.name}爱吃鱼`)} let cat = new Cat('tom') Cat.eat() //Cat爱吃鱼 //这是静态方法 Cat.move() //Cat.move is not a function cat.eat() //tom爱吃鱼 //这是实例方法 cat.move() //移动 //这是实例方法
构造函数自己上添加的成员 promise
下面的Cat.eat就是构造函数的静态方法,不能经过实例调用函数
function Cat(name){ this.move = function() { console.log(1) } } //直接定义在Cat构造函数中,实例不能调用 Cat.eat = function() {console.log(`${this.name}爱吃鱼`)} 构造函数调用 Cat.eat() //Cat爱吃鱼 Cat.move() //Cat.move is not a function let cat = new Cat() cat.eat() //cat.eat is not a function
原型中的方法实例和构造函数均可以访问到this
function Cat() { } Cat.eat = function() { console.log('静态方法') } Cat.prototype.eat = function() { console.log('原型方法') } let cat = new Cat() Cat.eat() //静态方法 Cat.prototype.eat() //原型方法,不用prototype就是打印静态方法 cat.eat() //原型方法
简而言之,实例方法就是只有实例能够调用,静态方法只有构造函数能够调用,原型方法是实例和构造函数均可以调用,是共享的方法。prototype
像Promise.all和Promise.race这些就是静态方法,Promise.prototype.then这些就是原型方法,new 出来的实例能够调用code
let promise = new Promise(function(resolve, rejected) { resolve() }) promise.then() //then是原型方法