JavaScript: Class.method vs. Class.prototype.method
以下两个声明之间有什么区别?
Class.method = function () { /* code */ }
Class.prototype.method = function () { /* code using this.values */ }
是否可以将第一个语句视为静态方法的声明,将第二个语句视为实例方法的声明?
以下两个声明之间有什么区别?
Class.method = function () { /* code */ }
Class.prototype.method = function () { /* code using this.values */ }
是否可以将第一个语句视为静态方法的声明,将第二个语句视为实例方法的声明?
是的,第一个函数与该构造函数的对象实例没有关系,您可以将其视为“静态方法”。
在JavaScript中,函数是一类对象,这意味着您可以像对待任何对象一样对待它们,在这种情况下,您只需向函数对象添加一个属性。
第二个函数,当您扩展构造函数原型时,它将可用于使用new
关键字创建的所有对象实例,并且该函数中的上下文(this
关键字)将引用您调用它的实际对象实例。
请考虑以下示例:
// constructor function
function MyClass () {
var privateVariable; // private member only available within the constructor fn
this.privilegedMethod = function () { // it can access private members
//..
};
}
// A 'static method', it's just like a normal function
// it has no relation with any 'MyClass' object instance
MyClass.staticMethod = function () {};
MyClass.prototype.publicMethod = function () {
// the 'this' keyword refers to the object instance
// you can access only 'privileged' and 'public' members
};
var myObj = new MyClass(); // new object instance
myObj.publicMethod();
MyClass.staticMethod();
是的,第一个是 也称为 ,而第二个是 。static method
class method
instance method
请考虑以下示例,以更详细地了解它。
在 ES5 中
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
Person.isPerson = function(obj) {
return obj.constructor === Person;
}
Person.prototype.sayHi = function() {
return "Hi " + this.firstName;
}
在上面的代码中,isPerson
是一个静态方法,而 sayHi
是 Person
的一个实例方法。
下面介绍如何从构造函数创建对象。Person
var aminu = new Person("Aminu", "Abubakar");
使用静态方法 。isPerson
Person.isPerson(aminu); // will return true
使用实例方法 。sayHi
aminu.sayHi(); // will return "Hi Aminu"
在 ES6 中
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
static isPerson(obj) {
return obj.constructor === Person;
}
sayHi() {
return `Hi ${this.firstName}`;
}
}
看看 static 关键字
是如何用来声明 static method isPerson 的
。
创建类的对象。Person
const aminu = new Person("Aminu", "Abubakar");
使用静态方法 。isPerson
Person.isPerson(aminu); // will return true
使用实例方法 。sayHi
aminu.sayHi(); // will return "Hi Aminu"
注意:这两个例子本质上是相同的,JavaScript仍然是一种无类语言。ES6中引入的主要是对现有基于原型的继承模型的语法糖。class