原型与原型链

原型基础

  • 可以通过Object.getPrototypeOf(xx)或xx.__proto__获取
  • null、undefined是没有__proto__对象
  • 函数类型除了有__proto__还有prototype属性
    • prototype默认有个constructor属性指向函数本身
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Person(){}
Person.prototype.__proto__ === Object.prototype // true
Object.prototype.__proto__ // null
Person.prototype.__proto__.__proto__ // null
Object.prototype.__proto__ //null
Person.prototype.constructor === Person // true

var o = {a: 1};
var a = ["yo", "whadup", "?"];
// o ---> Object.prototype ---> null
// a ---> Array.prototype ---> Object.prototype ---> null
// Person ---> Function.prototype ---> Object.prototype ---> null
Person.__proto__ === Function.prototype
Function.prototype // ƒ () { [native code] }

hasOwnProperty和in属性操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//01 提供一个构造函数
function Person(name) {
this.name = name;
}

//02 设置构造函数的原型对象的属性
Person.prototype.sayHello = function () {
console.log("hello");
}

//03 创建对象
var p1 = new Person();

//04 使用in关键字判断对象中是否存在以下属性:name age sayHello
console.log("age" in p1); //false
console.log("name" in p1); //true
console.log("sayHello" in p1); //true

//01 提供一个构造函数
function Person(name) {
this.name = name;
}

//02 设置构造函数的原型对象的属性
Person.prototype.sayHello = function () {
console.log("hello");
}

Person.prototype.des = "默认的描述信息";

//03 创建对象
var p1 = new Person();

//04 使用hasOwnProperty方法判断该属性是否是对象的实例属性
console.log(p1.hasOwnProperty("age")); //false
console.log(p1.hasOwnProperty("name")); //true
console.log(p1.hasOwnProperty("sayHello")); //false
console.log(p1.hasOwnProperty("des")); //false