如果对对象进行
obj.methodCall调用的话,js内部的逻辑其实是。
if obj.hasOwnProperty("methodCall")
调用自己的methodCall方法
else{
let proto = obj.__proto__;
while(proto != null){
查看proto.methodCall方法是否存在,存在就调用,break;
不然的话,proto = proto.__proto__
}
}
propertyName指的是对象上的string类型的属性名,propertySymbols是对象上的Symbol类型的属性名
for in循环遍历所有该对象enumerable的propertyNames,包括原型链上继承过来的,但不包括symbols。
Object.keys返回给对象上所有的自己的enumerable propertyNames(即不返回原型链上的)
Object.getOwnPropertyNames返回所有该对象上的属性名,包括不可枚举的(不返回原型链上的)
Object.getOwnPropertySymbols返回所有该对象上的Symbol名,包括不可枚举的(不返回原型链上的)
Reflect.ownKeys = Object.getOwnPropertyNames + Object.getPropertySymbols(所以包含了枚举的+不可枚举的)
数组的特点
Object.keys([1])=>["0"], Reflect.ownKeys([0])=>["0", "length"],
因为数组的length属性是不可枚举,不可配置的。
但是数组的length属性是writable的
arr=[1,2,3], arr.length = 10,将会把arr的长度变为10,并且后七位置为undefined。
Object.assign(target,..sources)将source上所有可枚举的的ownProperties和ownSymbols赋值给target(TheObject.assign()
method only copiesenumerable and own properties from a source object to a target object)并如sourc某属一getter话Object.assig只该读出来后直赋值target。
如果要把accessor的属性也复制上的话,参看这篇文章的completeAssign
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Object.defineProperty中有的configurable和enumerable默认值都为false。configurable设为false的时候,该属性通过delete关键字无法删除,同时,如果对属性尝试再次改变
Object.defineProperty(obj,{enumerable:true})这样的改变其配置的话,会抛出异常Uncaught TypeError: Cannot redefine property: propertyName。
Object.freeze彻底冻住对象,所有删除修改,添加以及defineProperty都将失效或者抛错。
Object.seal只会对对象的元属性进行密封,即不能将对象的data properties变成accessors,不能改变enumerable,writable和configurable属性。但是
直接修改对象已经存在的属性,如obj={a:1}; Object.seal(obj);obj.a = 2;是没问题的。