对象、原型与原型链

Object.defineProperty
let obj = {
    key0: 0
}
Object.defineProperty(obj, "key1", {
    value: "1",
    writable: false, // 是不是可写,默许false。obj.key1="1.0"; 不可写,不起作用
    configurable: false, // 是不是能够再次设置,默许false。不能再设置value,writable,configurable等属性
    enumerable: false // 是不是可罗列,默许false。不能在(for...in)中遍历
})
console.log(Object.getOwnPropertyDescriptor(obj, "key0")); // {value: 0, writable: true, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(obj, "key1")); // {value: "1", writable: false, enumerable: false, configurable: false}
推断对象是不是有指定属性或要领而不是继续的

obj.hasOwnProperty("toString")

猎取对象属性的数组
Object.getOwnPropertyNames(obj)

Object.keys(obj) // 猎取不到不可罗列(enumerable: false)的属性
Object.assign

assign() 用于将一切可罗列属性的值从一个或多个源对象复制到目的对象。同 $.extend();

Object.assign({}, obj); // {key0: "0"}
$.extend({}, obj); // {key0: "0"}
对象和JSON的转化
let xmObj = {
    name: "xiaoming",
    age: 20,
    sex: "男",
    isMarry: false
}
// 序列化成JSON
var res = JSON.stringify(xmObj, null, '  '); // typeof res == "string"
// 剖析成对象
var resO = JSON.parse(res); // typeof resO == "object"
先看一段代码
function Person(name, age){
    this.name = name;
    this.age = age;
}
Person.prototype.work=function(){}

function Programmer(name,age){
    Person.call(this,name,age);
}
Programmer.prototype = new Person();
Programmer.prototype.code=function(){}; // 假如写成对象会掩盖继续来的属性和要领,即赋值为{...}。

let example = new Programmer('码农',24); // 建立实例,example是实例,Programmer是原型。

Object.prototype.sth = function(){}
new的历程:建立一个空对象,让this指向它,经由过程this.name,this.age等赋值,终究返回this。
原型和实例

在上面代码中,Programmer是原型,example是它的实例。用instanceof检测,有
example instanceof Programmer === true
example instanceof Person === true
example instanceof Object === true

经由过程example.constructor属性返回对建立此对象的数组函数的援用。
example.constructor===Person
example.constructor===Person.prototype.constructor
然则constructor 属性易变,不可信任,它能够经由过程修正prototype而手动修正。

实例的__proto__对应原型的prototype
example.__proto__===Programmer.prototype
example.__proto__.__proto__===Person.prototypeProgrammer.prototype.__proto__
example.__proto__.__proto__.__proto__===Object.prototype
一切对象都是Object的实例,并继续Object.prototype的属性和要领。

原型链

找一个属性,首先在example.__proto__去找,假如没有,再去example.__proto__.__proto__找,……,再到Object.prototype,一直到null,即Object.prototype.__proto__ === null。这个串起来的链就是原型链。
比方:example.codeexample.workexample.doSthexample.toString都有,而example.foo就为undefined

    原文作者:落霞与孤鹜齐飞
    原文地址: https://segmentfault.com/a/1190000017314765
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞