【javascript】原型继承

190 阅读2分钟

javascript的getter和setter

属性的 getter 和 setter (javascript.info)

有两种类型的对象属性。

第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。

第二种类型的属性是新东西。它是 访问器属性(accessor property) 。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。

访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get 和 set 表示,当从外部访问属性时没有任何区别,但在对象内部是通过get和set方法表明从外部获取或者设置这个属性时会发生的事情。

原型继承

原型继承 (javascript.info)

我们可以通过_proto_去实现继承

let animal = { eats: true }; 
let rabbit = { jumps: true };
rabbit.__proto__ = animal; // 设置 rabbit.[[Prototype]] = animal

这样之后,如果读取本身没有的属性,会在原型链上面查找,但原型只针对读取属性,写入和删除操作会在对象本身上面进行,原型对象会受到保护

请注意,__proto__ 与内部的 [[Prototype]] 不一样__proto__ 是 [[Prototype]] 的 getter/setter。稍后,我们将看到在什么情况下理解它们很重要,在建立对 JavaScript 语言的理解时,让我们牢记这一点。

__proto__ 属性有点过时了。它的存在是出于历史的原因,现代编程语言建议我们应该使用函数 Object.getPrototypeOf/Object.setPrototypeOf 来取代 __proto__ 去 get/set 原型。稍后我们将介绍这些函数。

image.png

深入JavaScript系列(六):原型与原型链 - 掘金 (juejin.cn)

有三个重要的角色,对象,构造函数,原型对象。 对象的_proto_属性指向原型对象,构造函数的prototype属性指向原型对象,原型对象的constructor属性指向构造函数。 Object.prototype也是一个对象

F.prototype (javascript.info)

F.prototype 属性仅在 new F 被调用时使用,它为新对象的 [[Prototype]] 赋值。

如果在创建之后,F.prototype 属性有了变化(F.prototype = <another object>),那么通过 new F 创建的新对象也将随之拥有新的对象作为 [[Prototype]],但已经存在的对象将保持旧有的值。

function Rabbit() {} 
Rabbit.prototype = { eats: true }; 
let rabbit = new Rabbit();
Rabbit.prototype = {};
alert( rabbit.eats ); 

这个时候输出的值应该还是true,因为当prototype变化的时候不影响已有对象的原型

function Rabbit() {} 
Rabbit.prototype = { eats: true };
let rabbit = new Rabbit(); 
Rabbit.prototype.eats = false;
alert( rabbit.eats ); // ?

但是如果是这样修改,那么原型对象的属性以及被修改,引用的也是被修改的属性 :