prototype
: 函数(类)的一个属性: 是一个对象 {}__proto__
: 对象Object的一个属性: 是一个对象 {}.
类与他的实例中的原型关系
- 类的
prototype.constructor
指向类 - 类实例的
__proto__
指向类的prototype
等价于 对象的__proto__
保存着该对象的构造函数的prototype
- 类实例的
constructor
指向类 - 类实例没有
prototype
属性。 __proto__
类似数据结构中的链表,__proto__
本身包含着一个__proto__
指针,指向父类的__proto__
。- 基础类 Object的
prototype.__proto__
为null。 - 类的
__proto__
指向Function.prototype
ES6的类实际是es5 函数的语法糖,本质还是通过es5的函数实现的 - 类实例的
constructor
是可以直接更改的 !!!
class Person{
constructor(name){
this.name = name;
};
age = 31;
}
let p = new Person('姓名');
Person.prototype.sex = '男';
console.log(p);
console.log(p.constructor === Person); // true 类实例的constructor指向类
console.log(p.__proto__ === Person.prototype); // true
console.log(Object.prototype.__proto__); // null
console.log(Person.prototype.constructor === Person); // true
console.log(Person.prototype.__proto__ === Object.prototype); // true
console.log(Person.__proto__ === Function.prototype) // true
console.log(Function.__proto__ === Function.prototype) // true 顶层 语言设计
console.log(Obejct.__proto__ === Function.prototype); // true Function构造出了 Object
console.log(Obejct.__proto__ === Function.__proto__); // true
class NewPerson{}
p.constructor = NewPerson; // 直接更改实例的constructor
console.log(p.constructor === NewPerson) // true;
p = {
__proto__: Person.prototype = {
__proto__: Object.prototype
}
}
hasOwnProperty是Object.prototype的一个方法,它可是个好东西,他能判断一个对象是否包含自定义属性而不是原型链上的属性.
p.hasOwnProperty('age') // true;
p.hasOwnProperty('name') // true;
p.hasOwnProperty('sex') // false;
'age' in p // true
'name' in p // true
'sex' in p // true
- 使用forin 可以获取所有的可枚举属性.
- 使用Object.keys返回实例中所有可枚举属性组成的数组, 不包括原型中的!!!