AI生成--原型与原型链

news/2024/11/30 0:50:04/

原型(prototype)

在 JavaScript 中,每一个对象都有一个内部属性 [[prototype]],也可以称之为原型。原型是一个对象或 null。当我们访问一个对象的属性或方法时,如果对象本身没有这个属性或方法,那么 JavaScript 引擎会去对象的原型链上查找。也就是说,对象的原型链上的对象都可以为该对象提供属性和方法。

每一个构造函数(除了箭头函数)都有一个原型对象。我们可以通过构造函数的 prototype 属性来访问该原型对象。因此,所有通过该构造函数创建的对象都共享该原型对象。

示例代码:

function Person(name) {this.name = name;
}Person.prototype.sayHello = function() {console.log("Hello, I'm " + this.name);
}const person1 = new Person("Alice");
person1.sayHello(); // "Hello, I'm Alice"const person2 = new Person("Bob");
person2.sayHello(); // "Hello, I'm Bob"

在上面的代码中:

  • Person 是一个构造函数,它有一个原型对象 Person.prototype
  • Person.prototype 中定义了一个方法 sayHello
  • 通过 new 关键字使用 Person 构造函数创建了两个对象 person1person2
  • person1person2 都可以调用 sayHello 方法,因为它们都从 Person.prototype 原型对象上继承了该方法。

原型链(prototype chain)

JavaScript 中的原型链是一种对象间的委托关系。当我们访问一个对象的属性或方法时,如果该对象本身没有该属性或方法,那么 JavaScript 引擎会沿着该对象的原型链依次查找,直到找到该属性或方法或找到原型链的顶端 Object.prototypeObject.prototype 是所有对象的根原型对象,它的 [[prototype]] 属性为 null)为止。

示例代码:

function Person(name) {this.name = name;
}Person.prototype.sayHello = function() {console.log("Hello, I'm " + this.name);
}const person = new Person("Alice");console.log(person.hasOwnProperty("name")); // true
console.log(person.hasOwnProperty("sayHello")); // false
console.log(Person.prototype.hasOwnProperty("sayHello")); // true
console.log(person.__proto__ === Person.prototype); // true
console.log(Person.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__); // null

在上面的代码中:

  • person 对象的 name 属性是它自己的属性,因此 person.hasOwnProperty("name") 返回 true
  • person 对象的 sayHello 方法不是它自己的属性,而是它的原型对象 Person.prototype 的属性,因此 person.hasOwnProperty("sayHello") 返回 false
  • Person.prototypesayHello 方法是它自己的属性,因此 Person.prototype.hasOwnProperty("sayHello") 返回 true
  • person.__proto__ 指向 Person.prototype,因此 person.__proto__ === Person.prototype 返回 true
  • Person.prototype.__proto__ 指向 Object.prototype,因此 Person.prototype.__proto__ === Object.prototype 返回 true
  • Object.prototype.__proto__null,因为它没有更高层的原型对象,所以 Object.prototype.__proto__ 返回 null

http://www.ppmy.cn/news/414626.html

相关文章

《这就是软件工程师》读书笔记

第一部分 行业地图 选择:一线和次一线城市机会巨大 1.北京 2.上海、深圳、杭州 3.成都、广州、南京、厦门 4.福州、苏州 软件工程师的四大台阶: 阶段 能力 1 新手阶段 执行力 2 进阶阶段 设计能力 3 高手阶段 融会贯通的能力 4 行业大…

【长安的荔枝】读书摘记

马伯庸 小结 前两天,读完了这本书,书不长,故事情节紧凑,一口气几个小时便读完了。读完此书,倒吸一口气,细细品来,感概什么事都是有缘由的,比如书末说到福建有个风俗:“…

浪潮之巅-读后感

《浪潮之巅》这本书,草草翻阅感觉就是科技企业的一部兴衰史,介绍了各个时代引领浪潮的伟大企业如何在时代的大潮里走上巅峰,又如何在浪潮退却时步入低谷甚至沦落到被收购的结局;细细品读却感触颇深,企业从发展到极度辉…

《编码:隐匿在计算机软硬件背后的语言(Code:The Hidden Language of Computer Hardware and Software)》读书笔记

声明 该文章是阅读《编码:隐匿在计算机软硬件背后的语言》一书之后整理出的读书笔记。若有错误,还需继续修正与增删。 Preface 作者Charles Petzold是Windows编程界的大师,当今世界顶级技术作家。 他是WindowsGDI程序设计首席技术作家&#…

202303读书笔记|《长安的荔枝》——只要肯努力,办法总比困难多

202302读书笔记|《长安的荔枝》——只要肯努力,办法总比困难多 《长安的荔枝》这本书真是酣畅淋漓啊,读起来一气呵成,以讲故事的口吻叙述,上林署九品小官员——李善德,兢兢业业工作多年,终于借贷买了房&…

互联网摸鱼日报(2023-06-16)

互联网摸鱼日报(2023-06-16) InfoQ 热门话题 云器科技 CTO 关涛确认出席QCon北京站,探讨从 BI 到 BIAI,新计算范式下的大数据平台走向 QCon 全球软件开发大会广州站优秀出品人与明星讲师名单公布 GitHub Copilot:做出一个划时代的产品&…

【Dart】Dart学习(三)函数

函数 Dart 是一种真正面向对象的语言,所以即便函数也是对象并且类型为 Function,这意味着函数可以被赋值给变量或者作为其它函数的参数。你也可以像调用函数一样调用 Dart 类的实例。 下面是定义一个函数的例子: bool isNoble(int atomicN…

helm常用命令

helm是针对kubernetes的包管理器 helm命令: helm list -n namespace //查看ns下的release的名称 helm upgrade -n ns release helm-chart路径 //滚动升级组件 helm install -n ns release helm-chart路径 //安装组件 helm uninstall -n ns release helm…