Object-静态方法

85 阅读1分钟

静态方法

部署在构造函数自身的方法。

// 利用静态属性和静态方法统计实例个数
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