js中Object的常用方法

 关于__proto__和prototype
    prototype是函数的一个属性(每个函数都有一个prototype属性),
    这个属性是一个指针,指向一个对象。它是显示修改对象的原型的属性。
__proto__是一个对象拥有的内置属性,
(请注意:prototype是函数的内置属性,__proto__是对象的内置属性),
是JS内部使用寻找原型链的属性。
chrome和FF都可以访问到对象的__proto__属性,IE不可以。

eg:
   // new的过程
    var Person = function () {
    
    };
    var p = new Person()
    // new的过程拆分成以下三步
    var p ={
    
    } // (1)初始化一个对象p
    p.__proto__ = Person.prototype // (2)
    Person.call(p); // (3)也就是说构造p,可以称之为初始化p
    // 关键在于第二步,证明:
    var Person = function(){
    
    };
    var p = new Person();
    alert(p.__proto__ === Person.prototype)
    // 这段代码会返回true,说明步骤2是正确的
    // 示例:
    var Person = function() {
    
    
      Person.prototype.say
    };
1.Object.is():
用于比较两个值是否严格相等,与===运算符的行为基本一致
ES5比较两个值是否相等,只有两个运算符:(==)和严格相等运算符(===)
== 代表相同, ===代表严格相同
 当进行双等号比较时候: 先检查两个操作数数据类型,
如果相同, 则进行===比较,
如果不同, 则愿意为你进行一次类型转换,  转换成相同类型后再进行比较,
而===比较时, 如果类型不同,直接就是false.
他们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身、以及+0等于-0
c
onsole.log(null==undefined)
    console.log(null===undefined)
      console.log(Object.is('foo','foo'))
      console.log(Object.is(+0 === -0))
    console.log(NaN === NaN)
    console.log(Object.is(NaN,NaN))
2.Object.assign()
Object.assign()方法用于将源对象(source)的所有可枚举对象属性赋值到目标对象上(target)
var obj1 = {
    
    a: {
    
    b: 1}};  
var obj2 = Object.assign({
    
    }, obj1);  
// obj1.a.b = 5;  
console.log(obj2.a.b)



const test1 = {
    
    
  a:1,
  b:2
}
const test2 = {
    
    
  b:3,
  c:4
}
const test3 = {
    
    
  c:5,
  d:6
}
test3.__proto__.e = 99; // 在Object的原型上添加属性
const test4 = Object.assign(test1,test2,test3)
console.log(test1)
console.log(test2)
console.log(test4)
3.构造函数
此例题可说明,Object.assign()是浅拷贝
function Test3 (){
    
    
  this.c = 5;
  this.d = 6;
}

const test1 = {
    
    
  a:1,
  b:2
}

const test2 = {
    
    
  b:3,
  c:4
}
const test3 = new Test3()
test3.__proto__.e = 99;
const obj = new Object()
const test4 = Object.assign(test1,test2,test3);
console.log(test4)
console.log(test3)
4.Object.create()
Object.create()是ECMAScript5中新增的方法,用于创建一个新对象,
被创建的对象继承另一个对象的原型,在创建新对象时可以指定一些属性
语法:Object.create(proto[propertiesObject])
proto:对象,要继承的原型
propertiesObject:对象,可选参数,为新创建的对象指定属性对象。
该属性对象可以包含以下值
configurable	表示新创建的对象是否是可配置的,即对象的属性是否可以被删除或修改,默认false
enumerable	对象属性是否可枚举的,即是否可以枚举,默认false
writable	对象是否可写,是否或以为对象添加新属性,默认false
get	对象getter函数,默认undefined (获取对象属性值)
set	对象setter函数,默认undefined (设置对象属性值)
注意,使用Object.create()方法创建对象时,如果不是继承一个原有的对象,
而是创建一个全新的对象,就要把proto设置为null。

eg:
基类
 function Site() {
    
    
      this.name = 'Site';
      this.domain = 'domain'
    }
    Site.prototype.create = function (name,domain) {
    
    
      this.name = name;
      this.domain = domain;
    }
    // 子类
    function Itbilu() {
    
    
      Site.call(this)  // 调用基类的构造函数
    }
    // 继承父类
    Itbilu.prototype = Object.create(Site.prototype);
 // 创建类实例
    var itbilu = new Itbilu()
    // instanceof运算符用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上
    console.log(itbilu instanceof Site)
    console.log(itbilu instanceof Itbilu)
    itbilu.create('IT笔录','it笔录网站')
    console.log(itbilu.name);
    console.log(itbilu.domain);

    // instanceof运算符
    function Person(){
    
    };
    var p = new Person()
    console.log(p instanceof Person)
3.Object.definedProperty(obj,prop,descriptor)
关于对象:对象是由多个名/值对组成的无序的集合。
对象中每个属性对应任意类型的值。
定义对象可以使用构造函数或字面量的形式:
var obj = new Object; // obj = {}
obj.name = "张三"; // 添加描述
obj.say = function() {}; // 添加行为
除了以上添加属性的方式,还可以使用Object.defineProperty定义新属性或者修改原有的属性
语法:
Object.defineProperty(obj,prop,descriptor)
参数说明
obj:必需,目标对象
prop:必需,需要定义或修改的属性的名字
description:必需,目标属性所拥有的特性
返回值:
传入函数的对象:即第一个参数obj;
针对属性,我们可以给这个属性设置一些特性,比如是否只读不可以写;
是否可以被for...in或Object.keys()遍历
给对象的属性添加特性描述,目前提供两种形式:数据描述和存取器描述
eg:
当修改或定义对象的某个属性的时候,给这个属性添加一些特性:
var obj = {
    
    
  test:"hello"
}
// 1.对象已有的属性添加特性描述
Object.defineProperty(Obj,"test",{
    
    
  configurable: true || false, // 是否可以删除目标属性或者是否可以再次修改属性的特性(writable,configurable,enumerable).设置为true可以被删除或者可以重新设置特性,设置为false,不能删除或者重新设置特性。默认为false.
  enumerable:true || false, // 此属性是否可以被枚举(使用for...in或者Object.keys());true表示可以被枚举,false表示不可以被枚举
  value:任意类型的值,
  writable:true || false, // 属性的值是否可以被重写,设置为true可以被重写,设置为false不能被重写
});
// 2.对象新添加的属性的特性的描述
 Object.defineProperty(obj,"newKey", {
    
    
      configurable:true || false,
      enumerable:true || false,
      value:任意类型的值,
      writable: true || false,
    })
    
举例:
  1.writable
    var obj = {
    
    }
    // 第一种情况:writable设置为false,不能重写
    Object.defineProperty(obj,"newKey",{
    
    
      value:"hello",
      writable:false
    })
    // 更改newKey的值
    obj.newKey = "好好学习"
    console.log(obj.newKey)

    第二种情况:writable设置为true,可以重写
    var obj = {
    
    }
    Object.defineProperty(obj,"newKey",{
    
    
      value:"to be more",
      writable:true,
    });
    // 更改newKey的值
    obj.newKey="to be best girl";
    console.log(obj.newKey)
要加油!!!!!
2.enumerable
此属性是否可以被枚举(使用for...in或者Object.keys()).
设置为true可以被枚举,设置为false,不能被枚举,默认为false.
第一种情况:enumerable设置为false,不能被枚举
var obj = {
    
    }
Object.defineProperty(obj,"newKey",{
    
    
  value:"hello",
  writable:false,
  enumerable:false
})
// 枚举对象的属性
for (var attr in obj){
    
    
  console.log(attr); // 无输出结果
}
第二种情况:enumerable设置为true,可以被枚举
var obj = {
    
    }
Object.defineProperty(obj,"newKey",{
    
    
  value:"hello",
  writable:false,
  enumerable:true
});
// 枚举对象的属性
for(var attr in obj) {
    
    
  console.log(attr) 
}
3.configurable
是否可以删除目标属性或是否可以再次修改属性的特性(writable,configurable,enumerable).
设置为true可以被删除或者可以重新设置特性;设置为false,不能被删除或者不能重新设置属性,默认为false.
这个属性起到两个作用:
目标属性是否可以使用delete删除
目标属性是否可以再次设置特性

测试目标属性是否能够被删除
第一种情况:configurable设置为false,不能被删除。
   var obj = {
    
    }
    Object.defineProperty(obj,"newKey",{
    
    
      value:"hello",
      writable:false,
      enumerable:false,
      configurable:true,
    })
    // 删除属性
    delete obj.newKey;
    console.log(obj.newKey)
    第二种情况:configurable设置为true,可以被删除(修改上个案例的值,看演示结果)
注意:一旦使用Object.defineProperty给对象添加属性,
那么如果不设置属性的特性,
那么configurable、enumerable、writable这些值都为默认的false

猜你喜欢

转载自blog.csdn.net/weixin_44158539/article/details/120893378