回味JS(六)对象的继承

JavaScript 继承机制的设计思想?

  • 原型对象的所有属性和方法,都能被实例对象共享。也就是说,如果属性和方法定义在原型上,那么所有实例对象就能共享

prototype 属性有什么作用?

  • 构造函数生成实例的时候,prototype 属性会自动成为实例对象的原型;
  • 在构造函数的原型对象上添加一个属性,则这个构造函数生成的实例都会共享这个属性;
  • 实例对象本身没有某个属性或方法的时候,它会到原型中去找这个属性或方法

so,总结一下,原型对象的作用,就是定义所有实例对象共享的属性和方法

什么是原型链?

  • 每个对象拥有一个原型对象,通过 proto指针指向上一个原型 ,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向 null。
  • 这种关系被称为原型链 (prototype chain),通过原型链一个对象会拥有定义在其他对象中的属性和方法。

原型链的尽头是什么?

  • null, 没有任何属性和方法,也没有自己的原型

原型链中对象属性的查找规则是什么?

  1. 先寻找对象本身的属性
  2. 如果找不到,就到它的原型去找
  3. 如果还是找不到,就到原型的原型去找
  4. 直到最顶层的Object.prototype还是找不到,则返回undefined

constructor的属性有什么作用?

  • 可以得知某个实例对象,到底是哪一个构造函数产生的
  • 有了constructor属性,就可以从一个实例对象新建另一个实例

为什么修改原型对象时,一般要同时修改constructor属性的指向?

function A() {}
function B() {}

A.prototype.constructor === A; // true
A.prototype = B;
A.prototype.constructor === A; // false
A.prototype.constructor === Function; // true

如上,修改了A.prototype以后,constructor属性的指向就变了,因为A的新原型B是一个函数,而函数的constructor属性指向Function构造函数,所以,修改原型对象时,一般要同时修改constructor属性的指向。

一般可以像下面这么写:

C.prototype = {
  constructor: C,
  method1: function (...) { ... },
  // ...
};

// 或更好的写法
C.prototype.method1 = function (...) { ... };

tips:

  • 可以通过name属性,从实例得到构造函数的名称
A.prototype.constructor = A;
var a = new A();
a.constructor.name // "A"

instanceof 和 typeof 判断类型有什么区别?

  • instanceof表示对象是否为某个构造函数的实例
  • instanceof运算符只能用于对象,不适用原始类型的值; 而typeof适用于判断原始类型
  • 结合instanceof和typeof运算符可以判断一个值是否为非null的对象
null instanceof Object
// false

typeof null
// "object"

如何实现构造函数的继承?

  1. 在子类的构造函数中,调用父类的构造函数
  2. 让子类的原型指向父类的原型,或者让子类的原型等于一个父类的实例

例如下面是实现Sub继承父类Super的过程:

function Super() {};

function Sub(value) {
  Super.call(this); // 子类内部调用父类的构造函数
  this.prop = value;
}
Sub.prototype = Object.create(Super.prototype); // 让子类的原型指向父类的原型
Sub.prototype.constructor = Sub; // 别忘了同时修改constructor属性
Sub.prototype.method = '...';

立即执行函数的作用?

  • 封装私有变量,创建一个独立的作用域,避免变量污染

怎么获取实例对象obj的原型对象?

  • obj.proto
  • obj.constructor.prototype
  • Object.getPrototypeOf(obj)

严格模式下有哪些规则?

  • 不可以设置字符串的length属性,会报错
  • 对只读属性赋值,或者删除不可配置(non-configurable)属性都会报错
  • 对一个只有取值器(getter)、没有存值器(setter)的属性赋值,会报错
  • 对禁止扩展的对象添加新属性,会报错
  • 使用eval或者arguments作为标识名,将会报错
  • 函数不能有重名的参数
  • 禁止八进制的前缀0表示法,整数第一位为0,将报错
  • 全局变量必须显式声明
  • 禁止 this 关键字指向全局对象
  • 函数内部不得使用fn.caller、fn.arguments,否则会报错
  • 函数内部使用arguments.callee、arguments.caller将会报错
  • 严格模式下无法删除变量,如果使用delete命令删除一个变量,会报错。只有对象的属性,且属性的描述对象的configurable属性设置为true,才能被delete命令删除
  • 禁止使用 with 语句
  • eval所生成的变量只能用于eval内部
  • arguments 不再追踪参数的变化
  • 不允许在非函数的代码块内声明函数
  • 新增了一些保留字(implements、interface、let、package、private、protected、public、static、yield等)。使用这些词作为变量名将会报错
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容