幾個api
原型鏈 可以閱讀此文
Function instanceof Object // true
Object instanceof Function // true
Object.prototype.isPrototypeOf(Function) // true
Function.prototype.isPrototypeOf(Object) // true
Object.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
說明下:Object和Function都是函數對象,函數對象的_proto_都指向Function.prototype,構造函數的隱式原型( proto)指向 Function.prototype, 函數對象的__proto__指向Function.prototype
自測
function Test(name, age){this.name = namethis.age = age
}
Test.prototype.say = function(){console.log('我能說話')
}
var obj3 = new Test('Jack', 26)
var obj4 = new Test('Rose', 24)1, Test.prototype === ( ) ?
2, obj3.__proto__.__proto__ === ( ) ?
3, obj3.__proto__ === obj4.__proto__ ?
4, Test.prototype.__proto__ === ( ) ?
5, obj4.__proto__.constructor === ( ) ?
6, Object.prototype.__proto__ === ( ) ?
7, obj3.say === obj4.say ?// 1, obj3.__proto__ 或 obj4.__proto 2,Object.prototype 3, true (二者都由Test new出來,在原型鏈上都指向 Test.prototype)
// 4, Object.prototype 5, Test 6, null (終點) 7,true (同問題3)
Object.getPrototypeOf方法返回參數對象的原型。這是獲取原型對象的標準方法。
var F = function () {};var f = new F();Object.getPrototypeOf(f) === F.prototype // true// 幾種特殊對象的方法:// 空對象的原型是 Object.prototypeObject.getPrototypeOf({}) === Object.prototype // true// Object.prototype 的原型是 nullObject.getPrototypeOf(Object.prototype) === null // true// 函數的原型是 Function.prototypefunction fun() {}Object.getPrototypeOf(fun) === Function.prototype // true
Object.prototype.isPrototypeOf()用來判斷該對象是否為參數對象的原型。
console.log(Object.prototype.isPrototypeOf({})) // true
console.log(Object.prototype.isPrototypeOf([])) // true
console.log(Object.prototype.isPrototypeOf(/xyz/)) // true
console.log(Object.prototype.isPrototypeOf(Object.create(null))) // false
和 instanceof 的區別
console.log(A instanceof B);
console.log(B.prototype.isPrototypeOf(A));
Object.defineProperty() 是 JavaScript 中用于定義或修改對象的屬性的方法,可以控制屬性的特性(如可枚舉性、可配置性、可寫性等)。
Symbol 可以參考此文
let sym = Symbol();
console.log(typeof sym); // symbol
let genericSymbol = Symbol();
let otherGenericSymbol = Symbol();
let fooSymbol = Symbol('foo');
let otherFooSymbol = Symbol('foo');
console.log(genericSymbol == otherGenericSymbol); // false
console.log(fooSymbol == otherFooSymbol); // false
屬性中含symbol的對象 獲取屬性方法
Object.getOwnPropertySymbols() ,類似于 Object.getOwnPropertyNames() 返回對象實例的常規屬性數組, Object.getOwnPropertySymbols() 返回對象實例的符號屬性數組。
Object.getOwnPropertyDescriptors(),返回同時包含常規和符號屬性描述符的對象。
Reflect.ownKeys() ,返回常規和符號屬性的鍵:
let s1 = Symbol('foo'),
s2 = Symbol('bar');
let o = {[s1]: 'foo val',[s2]: 'bar val',baz: 'baz val',qux: 'qux val'
};
console.log(Object.getOwnPropertySymbols(o));
// [Symbol(foo), Symbol(bar)]
console.log(Object.getOwnPropertyNames(o));
// ["baz", "qux"]
console.log(Object.getOwnPropertyDescriptors(o));
// {baz: {value: 'baz val', writable: true, enumerable: false, configurable: true}, qux: {...}, Symbol(foo): {...}, Symbol(bar): {...}}
console.log(Reflect.ownKeys(o));
// ["baz", "qux", Symbol(foo), Symbol(bar)]