前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript面试卷(三) -- 原型链的根源

JavaScript面试卷(三) -- 原型链的根源

作者头像
用户7293182
发布2022-01-17 21:57:17
3210
发布2022-01-17 21:57:17
举报
文章被收录于专栏:jQuery每日经典jQuery每日经典

JavaScript 有个原型链,既然是链,那它肯定存在链的起始和链的结束。上篇文章中有这样一句话:

每个对象都有一个__proto__对象属性(除了Object);每个函数都有一个Prototype 对象属性。

一个函数本身就是一个对象,它的原型链由自身发出(链的结束),一直延伸到 Object 的 prototype(链的起始)。

当访问一个对象的属性时,先检查自身属性,如果没有,则会沿着原型链一直找下去。(上文有详细结束)

一、Object.prototype

Object.prototype 属性表示 Object 的原型。JavaScript 中几乎所有的对象都是 Object 的实例;所有的对象都继承了 Object.prototype 的属性和方法,它们可以被覆盖(除了以null 为原型的对象,如Object.create(null))。例如,新的构造函数的原型覆盖原来的构造函数的原型,提供它们自己的 toString() 方法。对象的原型的改变会传递到所有对象上,除非这些属性和方法被其他对象原型链更里层的改动所覆盖。

就以 toString() 方法为例:

1. 最根本的 toString()

默认情况下,toString() 方法被每个继承自Object的对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回“[object type]”, 其中 type 是对象类型。

例如:

被重写的对象也可以通过 call 或者 apply 函数调用最原始的toString()方法。

这个 toString() 的最佳事件,有兴趣的同志们可以查看一下 jQuery 中 type 方法的实现。

注:从JavaScript 1.8.5开始,用null 调用 toString() 方法会返回 [object Null],类似的用undefined 调用会返回 [object Undifined]。

2. 重写的 toString()

可以在新创建的函数的原型上自定义 一个方法来取代默认的 toString() 方法。该方法不能传入参数并且必须返回一个字符串。自定义的 toString() 方法可以是我们需要的值,但如果它附带有关对象的信息,它将变的非常有用。

在下面的代码中,定义了一个Dog对象数据类型,并且创建了该对象的一个实例:

代码语言:javascript
复制
function Dog(name,breed,color,sex) {
  this.name=name;
  this.breed=breed;
  this.color=color;
  this.sex=sex;
}
var theDog = new Dog( 
      "Gabby","Lab","chocolate","female");

如果当前的对象调用了 toString() 方法,它将会返回从 Object 继承下来的 toString() 方法的返回默认值:

代码语言:javascript
复制
theDog.toString(); // 返回 [object Object]

下面的代码中定义了一个叫做 dogToString() 的方法来覆盖默认的 toString() 方法。这个方法生成一个 "property = value" 形式的字符串,该字符串包含了当前对象的 name, breed,color 和 sex的值。

代码语言:javascript
复制
Dog.prototype.toString = function dogToString() {
 var ret = "Dog " + this.name 
          + " is a " + this.sex 
          + " " + this.color 
          + " " + this.breed;
 return ret;
}

有了上面的这段代码之后,在上下文中任何时候使用 theDog ,JavaScript 都会自动调用 dogToString() 方法,并且返回下面的字符串内容:

代码语言:javascript
复制
Dog Gabby is a female chocolate Lab
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 jQuery每日经典 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档