prototype

原型继承 原型链

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删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值