1. 程式人生 > >js中的物件 函式 原型

js中的物件 函式 原型

// 關於 Function Object 和 proto prototype
// 1.每一個物件例項都有一個 proto 屬性,這個屬性就是指向 物件建構函式的原型.
let b = new Function();
console.log(b.__proto__ === Function.prototype); // true
console.log(Function.prototype); // [Function]
console.log(Function.prototype.prototype); // undefined

// 2. Function 是 Object, Object 也是 Function
console.log(Function instanceof Object); // true
console.log(Object instanceof Function); // true
console.log(b instanceof Object); // true
console.log(b instanceof Function); // true

// Function 和 Object 區別
// 1.由 Function 創造出來的例項物件,既是 Object 又是 Function
// 2.由 Object 創造出來的例項物件, 是 Object,但不是 Function
let a = new Object();
console.log(a instanceof Object); // true
console.log(a instanceof Function); // false

//
console.log(a.__proto__ === Object.prototype); // true
console.log(Object.prototype); // {}
console.log(Object.prototype.prototype); // undefined

// 如何形成原型鏈?
class A{
constructor(){
this.name = 'a';
}
sayHi(){
console.log('this is a say hi!');
}
}
class B extends A{
constructor(){
super();
this.age = 2;
}
}

console.log(A.prototype); // {}
console.log(B.prototype); // {}

// 下面演示了 原型鏈
// B->A->Object
let obj = new B();
console.log(obj.__proto__ === B.prototype); // true;
console.log(B.prototype.__proto__ === A.prototype); // true
console.log(A.prototype.__proto__ === Object.prototype);
console.log(Object.prototype.__proto__); // null

console.log(A.__proto__ === Function.prototype); // true
console.log(B.__proto__ === Function.prototype); // false
console.log(B.__proto__.constructor); // [Function: Function]

// 只有 通過 new A(); 建立的物件的 proto 才指向 A.prototype

// 疑問: B.__proto__ 到底指向哪?
console.log(B.__proto__ === A.prototype); // false