原型继承 原型链
js 没有提供类继承。虽然es2015新增了class关键字,但仅仅作为一个语法糖 , js仍然是基于原型的。
js继承只有一种结构:Object。每个object内部都有一个link连接自己的prototype object。并且这个prototype对象有自己的prototype。这样就构成了一条链,直到这个link连接的prototype对象为null,这条链就叫原型链,原型链的最后指向为null。
当访问object的一个property时 , 不止在object能访问,在object的prototype上也可以访问到,这样沿着原型链层层向上,执导找到属性名或达到原型链末端。
遵循ECMAScript标准,someObject.[[Prototype]] 符号是用于指派 someObject 的原型。这个等同于 JavaScript 的 proto 属性。从 ECMAScript 6 开始, [[Prototype]] 可以用Object.getPrototypeOf()和Object.setPrototypeOf()访问器来访问。
不同的创建object的方法
对象字面量或是一个普通函数
// o ---> Object.prototype ---> null
var o = {a: 1};
// a ---> Array.prototype ---> Object.prototype ---> null
var a = ['1', '2', '3'];
// f ---> Function.prototype ---> Object.prototype ---> null
function f() {
return 1;
}
使用构造器
function Person(){
}
Person.prototype = {
name : 'magic',
age : 18
}
var person = new Person();
//person的[[Prototype]]是Person.prototype
使用es5新方法Object.create()
var a = {a: 1};
// a ---> Object.prototype ---> null
var b = Object.create(a);
// b ---> a ---> Object.prototype ---> null
console.log(b.a); // 1 (inherited)
var c = Object.create(b);
// c ---> b ---> a ---> Object.prototype ---> null
var d = Object.create(null);
// d ---> null
console.log(d.hasOwnProperty);
// undefined, because d doesn't inherit from Object.prototype
使用class关键字
class, constructor, static, extends, and super.
//这里暂不做深入学习。
hasOwnProperty是唯一一个只处理object自身instance属性不涉及原型链的方法。
var o = {
name : 'magic',
age : 18
}
var b = Object.create(o);
console.log(Object.getPrototypeOf(b))//Object { name: "magic", age: 18 }
方法
isPrototypeOf(instance)
判断一个prototype是否是一个实例的原型。
Object.getPrototypeOf(instance)
获取一个实例的原型。
Object.getPrototypeOf(person)
Object.getPrototypeOf(person).name
delete
直接通过实例添加的属性可以通过delete删除。