1、静态属性
只能通过 (类名.属性) 的方式访问,而实例是无法访问的。
可以通过Object.getOwnpropertyNames(类名)查看类的静态属性。
function Person(name) {
this.name = name
this.hobby = function() {
console.log("我想打篮球!")
}
}
// 静态属性:实例对象无法访问,只能通过构造函数名来访问
Person.age = 18;
let P1 = new Person('张三');
console.log(P1.age); // undefined
console.log(Person.age); // 18
2、实例属性
是属于实例自己的, 访问方式:(实例名.属性)、(this.属性,这里的this指向的就是实例本身)。
实例属性可以直接控制台打印 实例名 查看,也可以通过Object.getOwnpropertyNames(实例名)查看。
广义上可以认为实例属性包括构造函数中绑定到this上的属性以及挂载到构造函数原型上的属性。
区别在于,构造函数中绑定到this上的属性在每次实例化的时候都会新开辟一个空间来存放该属性(深拷贝),从而造成空间浪费,而挂载到构造函数原型上的属性只会浅拷贝到实例化的对象上,所以对于不会经常改变的或者实例化对象的共同的属性挂载到构造函数原型上会更好。
function Person(name) {
// 实例属性
this.name = name
this.like= function() {
console.log("我想玩!")
}
}
Person.age = 18;
// 实例属性
Person.prototype.hobby = function() {
console.log(this.name);
console.log("我想打篮球!")
}
let P1 = new Person('张三');
console.log(P1.name); // 张三
console.log(P1.age); // undefined
// 注意:声明在构造器函数原型上的属性和构造器函数中绑定到this
// 上的属性最后都会指向新生成的对象,故可以在构造器函数原型上
// 的属性中使用this上的属性!
P1.hobby(); // 张三 我想打篮球!
//
let zhangsan = new Person('张三');
let lisi = new Person('李四');
console.log(zhangsan.hobby === lisi.hobby); // true
console.log(zhangsan.like=== lisi.like); // false
3、原型属性
构造函数和实例都可以访问的属性, 两种访问方式 :(构造函数名.prototype.属性)、(实例.属性)。
原型属性可以直接控制台打印 实例名.__proto__ 查看,也可以通过Object.getOwnpropertyNames(类名.prototype)查看。
function Test(name){
}
var test1 = new Test();
Test.prototype.counter = 0 ;
console.log(Test.prototype.counter);//0
console.log(test1.counter);//0