JavaScript 中Object对象的方法

参考:https://wangdoc.com/javascript/oop/object.html

1、Object.getPrototypeOf():返回参数对象的原型,这是获取原型对象的标准方法。

var Test = function () {};
var test = new Test();
console.log(Object.getPrototypeOf(test));        //{constructor: ƒ}
console.log(Object.getPrototypeOf(test) === Test.prototype);    //true





// 空对象的原型是 Object.prototype
console.log(Object.getPrototypeOf({}) === Object.prototype) // true

// Object.prototype 的原型是 null
console.log(Object.getPrototypeOf(Object.prototype) === null) // true

// 函数的原型是 Function.prototype
function f() {}
console.log(Object.getPrototypeOf(f) === Function.prototype) // true

2、Object.setPrototypeOf():为参数对象设置原型,返回该参数对象。它接受两个参数,(现有对象,原型对象)。

var obj = {};
var obj_ = {x:1};
Object.setPrototypeOf(obj, obj_);

console.log(obj);        //{}
console.log(Object.getPrototypeOf(obj) === obj_);        //true
console.log(obj.x);            //1


//Object.setPrototypeOf()方法将对象obj的原型设置为对象obj_,所以obj可以共享obj_的属性。

3、Object.create():该方法接受一个对象作为参数,然后以它为原型,返回一个实例对象,该实例完全继承原型对象的属性。 使用Object.create方法时,必须提供对象原型,即参数不能为空,或者不是对象,否则报错。

//原型对象
var obj = {
    print: function() {
        console.log('Hello World!');
    }
};

//实例对象

var obj_ = Object.create(obj);

console.log(Object.getPrototypeOf(obj_) === obj);   //true

console.log(obj_.print === obj.print);            //true

obj_.print();                //Hello World!


//以obj对象为原型,生成了obj_对象,obj_继承了obj的所有属性和方法。

 Object.create方法生成的新对象,动态继承了原型,在原型上添加或修改任何方法,会立刻反映在新对象上。

var obj1 = {x:1};

var obj2 = Object.create(obj1);
console.log(obj2.x);     //1
obj1.x = 2; 
console.log(obj2.x);        //2

Object.create方法生成的对象,继承了它的原型对象的构造函数。

function Test() {};
var test = new Test();
var obj = Object.create(test);

console.log(obj.constructor);           // ƒ Test() {}
console.log(obj.constructor === Test);        //true
console.log(obj instanceof Test);            //true

4、Object.prototype.isPrototypeOf():用来判断该对象是否为参数对象的原型。

var obj1 = {};
var obj2 = Object.create(obj1);
var obj3 = Object.create(obj2);

console.log(obj2.isPrototypeOf(obj3));        //true
console.log(obj1.isPrototypeOf(obj3));        //true


//obj1和obj2都是obj3的原型,只要实例对象处在参数对象的原型链上,isPrototypeOf方法都返回true。



var a = Object.prototype.isPrototypeOf({});
var b = Object.prototype.isPrototypeOf([]) ;
var c = Object.prototype.isPrototypeOf(/xyz/); 
var d = Object.prototype.isPrototypeOf(Object.create(null));

console.log(a);        //true
console.log(b);        //true
console.log(c);        //true
console.log(d);        //false



//由于Object.prototype处于原型链的最顶端,所以对各种实例都返回true,只有直接继承自null的对象除外.

 5、Object.prototype._proto_:实例对象的_proto_属性,返回该对象的原型,该属性可读写。

var A = {
  name: '张三'
};
var B = {
  name: '李四'
};

var proto = {
  print: function () {
    console.log(this.name);
  }
};

A.__proto__ = proto;
B.__proto__ = proto;

A.print() // 张三
B.print() // 李四

6、 获取原型对象方法的对比:获取实例对象obj的原型对象有三种方法:

obj._proto_             obj.constructor.prototype                           Object.getPrototypeOf(obj)

上面三种方法中,_proto_属性只有浏览器才需要部署,其他环境可以不部署;obj.constructor.prototype在手动改变原型对象时,可能会失效。所以,推荐使用第三种Object.getPrototypeOf()方法,获取原型对象。

7、Object.getOwnPropertyNames():返回一个数组,成员是参数对象本身的所有属性的键名,不包含继承的属性键名。

var result = Object.getOwnPropertyNames(Date);
console.log(result); //(6) ["length", "name", "prototype", "now", "parse", "UTC"]

//Object.getOwnPropertyNames 方法返回所有键名(不管对象本身的属性是否可以遍历)。
//如果只需要获取那些可以遍历的属性,使用Object.keys方法。

var result2 = Object.keys(Date);
console.log(result2);                //[]   Date对象所有自身的属性,都是不可以遍历的。

8、Object.prototype.hasOwnProperty():返回一个布尔值,用于判断某个属性定义在对象自身,还是定义在原型链上。

 注:hasOwnProperty方法时JavaScript中唯一一个处理对象属性时,不会遍历原型链的方法。

9、in运算符:返回一个布尔值,表示一个对象是否具有某个属性,它不区分该属性是对象自身的属性,还是继承的属性。 in运算符常用于检查一个属性是否存在。

10、对象的拷贝:如果要拷贝一个对象,需要做到下面两件事情:(1)确保拷贝后的对象,与原对象具有同样的原型。
(2)确保拷贝后的对象,与原对象具有同样的实例属性。

function copyObject(orig) {
  var copy = Object.create(Object.getPrototypeOf(orig));
  copyOwnPropertiesFrom(copy, orig);
  return copy;
}

function copyOwnPropertiesFrom(target, source) {
  Object
    .getOwnPropertyNames(source)
    .forEach(function (propKey) {
      var desc = Object.getOwnPropertyDescriptor(source, propKey);
      Object.defineProperty(target, propKey, desc);
    });
  return target;
}

 

 

 

 

你可能感兴趣的:(JavaScript)