静态方法
部署在构造函数自身的方法。
// 利用静态属性和静态方法统计实例个数
function Person(name,age){
this.name = name
this.age = age
// 静态属性
if(!Person.count){
Person.count = 0
}
Person.count++
}
// 静态方法
Person.print = function (){
console.log(Person.count)
}
var p1 = new Person('lxx',25)
var p2 = new Person('xxx',28)
var p3 = new Person('xyy',18)
Person.print() // 3
Object.setPrototypeOf(obj,prototype)
设置一个指定的对象的原型到另一个对象或 null
obj 要设置其原型的对象。
prototype 该对象的新原型。
let obj1 = {name:'lxx'}
let obj2 = {}
// 设置obj2的原型对象为obj1
Object.setPrototypeOf(obj2,obj1)
// obj2通过原型链也可以访问到name属性
obj2.name // lxx
注意:由于现代JavaScript引擎优化属性访问所带来的特性的关系,更改对象的
[[Prototype]]在各浏览器和JavaScript引擎上都是一个很慢的操作。如果你关心性能,应该避免设置一个对象的[[Prototype]]。应该使用Object.create()来创建带有你想要的[[Prototype]]的新对象。
Object.getOwnPropertyNames()
与 Object.keys 类似,接受一个对象作为参数,返回包含该对象自身的所有属性名(包括不可枚举属性但不包括 Symbol 值作为名称的属性)的数组。
var obj = {
name:'lxx',
age:25,
height:1.88
}
Object.defineProperty(obj,'length',{
value:4
enumerable:false
})
var keyArr = Object.getOwnPropertyNames(obj)
keyArr // [name,age,height,length]
Object.defineProperty()
在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
定义访问器属性
var book = {
_year:2004,
edition:1
}
Object.defineProperty(book,'year',{
get:function() {
return this._year
},
set:function(newVal) {
if(newVal > 2004) {
this._year = newVal
this.edition += newVal - 2004
}
}
})
book.year = 2005 // 写入时调用的是 set
book.yesr // 读取时调用的是 get
book.edition // 2
book._year // 2005