成员:属性和方法。
实例:由构造函数创建出来的对象。
静态成员:和构造函数相关的属性和方法。
实例成员:由构造函数创建出来的对象的属性和方法。
静态成员与构造函数有关,实例成员与实例有关。
静态成员和实例成员一般情况下是不能直接相互访问的,即:实例(对象)是无法直接访问静态成员的;反之也是同样道理。
实例为什么访问不到静态成员?实例遵循属性搜索原则,只看对象本身以及对象的原型链,原型链中没有构造函数。
function Person() {
this.age = 19;
}
Person.prototype.each = function() {};
var p = new Person();
age属性 和 each 方法,都是实例成员。
p.age;
p.each();
这个age属性通过Person来访问 是访问不到的。
onsole.log(Person.age);
Person.say = function() {};
静态成员
console.log(Person.name);
console.log(Person.say);
为什么构造函数访问不到实例成员?因为构造函数作为一个对象,它的原型链没有这个属性。
Person -> Function.prototype -> Object.prototype -> null
this.sayHi=function (){//实例成员
alert("你好");
}
}
Person.say = function(){ //静态成员
alert("说话");
}
实例成员和静态成员那个用起来更容易?静态成员使用起来更方便,因为实例成员要使用的时候需要先创建对象
如果静态成员和实例成员都要实现同一个功能,此时,给谁添加?此时,添加一个静态成员使用起来更加容易。
解决这个问题有三种方式:
1.实现两份(实例成员添加一个,静态成员也添加一个)
function Person() {}
Person.prototype.say = function() {
// 大量的代码逻辑
console.log("你好");
};
Person.say = function() {
// 大量的代码逻辑
console.log("你好");
};
2.给静态成员添加一个,实例成员要用的话,直接调用静态成员。(推荐使用)
function Person() {}
// 添加一个静态方法
Person.each = function(str) {
console.log(str);
};
Person.prototype.each = function(str1) {
// 实例中直接调用这个 静态方法即可
Person.each(str1);
};
var p = new Person();
p.each("这是要打印的内容");
3.给实例成员添加一个,静态成员要用的话,直接调用实例成员。
function Person() {}
Person.prototype.say = function() {
// 大量的代码逻辑
console.log("你好");
};
Person.say = function() {
var p = new Person();
p.say();
// Person.prototype.say();
};
Person.say();