当前位置: 首页 > 知识库问答 >
问题:

javascript - JavaScript中prototype 为何是不能被打印显示的呢? 那么它的意义是什么?

万坚壁
2024-08-15

prototype 为何是不能被打印显示的呢?
那么它的意义是什么?

function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
}

let person1 = new Person('John', 30);
person1.sayHello();   // 可调用
console.log(person1);  // 没有原型上被定义的数据
console.log(person1.prototype);  // undefined

共有3个答案

傅博瀚
2024-08-15
  1. "类"函数在执行new操作的时候会创建一个对象, 在这个例子把这个对象赋值给了person1
  2. 这个对象(person1)的内部链接[[Prototype]]会关联Person.prototype对象
console.log(Object.getPrototypeOf(person1) === Person.prototype); // true
  1. person1.sayHello()执行过程是:

    • person1对象上直接获取=>没有
    • person1的[[Prototype]]链上查找, 根据上面的第2条, [[Prototype]]会关联Person.prototype对象, 所以实际调用的是Person.prototype.sayHello
孔深
2024-08-15

需要用 Object.getPrototypeOf(person1)

另外 console.log(person1) 里也是可以找到它的 prototype 上的属性的,只是不会直接显示子在 person1 下,而是在他的 <prototype> 下面(firefox,不同的浏览器/IDE 这个显示的“属性”名会有不同,因为这实际上不是一个“属性”,不是可以直接看到的)

漆雕亮
2024-08-15

在JavaScript中,prototype 不是一个实例对象可以直接访问的属性,这就是为什么你在尝试打印 person1.prototype 时会得到 undefined。实际上,每个函数对象都有一个 prototype 属性,该属性是一个指向原型对象的指针,而这个原型对象用于实现基于原型的继承与属性共享。

prototype 为何是不能被实例直接访问的?

  • 当你创建一个实例(如 person1)时,它内部有一个指向其构造函数(这里是 Person)的 prototype 对象的链接(通常被称为 __proto__,尽管这不是ECMAScript标准的一部分,而是某些JavaScript引擎实现的一个属性,用于访问内部 [[Prototype]] 链接)。这个链接是自动创建的,但你不能直接通过实例来访问或修改 prototype 属性,因为该属性是定义在函数对象(构造函数)上的。

prototype 的意义是什么?

  • 属性共享prototype 允许你在所有实例之间共享方法和属性。这意味着,一旦你在原型上定义了一个方法或属性,所有的实例都可以访问它,而不需要在每个实例上单独定义。这大大节省了内存。
  • 继承:基于原型的继承是JavaScript的核心特性之一。通过原型链,你可以实现复杂的继承关系,允许一个对象继承另一个对象的属性和方法。
  • 灵活性:虽然JavaScript的原型继承系统可能初看起来有些混乱,但它提供了极高的灵活性。你可以动态地修改原型,进而影响到所有基于该原型的实例。

示例说明

在你的例子中,Person.prototype.sayHello 是在 Person 构造函数的原型上定义的一个方法。所有通过 new Person(...) 创建的实例都会继承这个方法,但它们并不直接拥有 prototype 属性。相反,它们通过内部的 [[Prototype]] 链接(在大多数环境中通过 __proto__ 访问)来访问原型链上的方法和属性。

如何查看原型链

如果你想要查看实例的原型链,可以使用 Object.getPrototypeOf() 方法或 __proto__(尽管不推荐使用后者,因为它不是标准属性):

console.log(Object.getPrototypeOf(person1) === Person.prototype);  // true
console.log(person1.__proto__ === Person.prototype);  // 大多数环境中也是 true,但不推荐

这样,你就可以看到 person1 的原型确实是 Person.prototype,从而验证了原型链的存在和它的工作方式。

 类似资料:
  • 本文向大家介绍Javascript中的Prototype到底是什么,包括了Javascript中的Prototype到底是什么的使用技巧和注意事项,需要的朋友参考一下 Javascript也是面向对象的语言,但它是一种基于原型Prototype的语言,而不是基于类的语言。在Javascript中,类和对象看起来没有太多的区别。 什么是prototype: function定义的对象有一个proto

  • 我想知道=_运算符在JavaScript中的含义。看起来像是在做作业。 示例:

  • 问题内容: 在此页面中,我找到了新的JavaScript函数类型: 我已经知道了什么,以及做的,但不知道什么是注定的。它是什么? 问题答案: 这是一个生成器功能。 生成器是可以退出并稍后重新输入的函数。它们的上下文(变量绑定)将在重新进入时保存。 调用生成器函数不会立即执行其主体。而是返回该函数的迭代器对象。调用迭代器的方法时,将执行生成器函数的主体,直到第一个表达式指定要从迭代器返回的值,或者使

  • 问题内容: 我想知道 = + _ 运算符在JavaScript中的含义。看起来像是在做作业。 例: 问题答案: r = +_; 尝试将任何内容强制转换为数字。 只是一个变量名(不是运算符),可以是,等等。 例: 将“ 1”强制转换为纯数字1。 现在,不是。 此外,根据算术运算符的MDN页面: 一元加号运算符位于其操作数之前,并求值为其操作数,但是 尝试将其转换为数字(如果尚未转换为数字) 。 […

  • 问题内容: 我了解JSON,但不了解JSONP。Wikipedia上有关JSON的文档是JSONP的最高搜索结果。它说: JSONP或“带填充的JSON”是JSON扩展,其中将前缀指定为调用本身的输入参数。 ??什么电话 这对我来说毫无意义。JSON是一种数据格式。没有电话 在第二个搜索结果是由某些人叫雷米,谁写的这个约JSONP: JSONP是脚本标记注入,它将响应从服务器传递到用户指定的函数。

  • 我们在node.js 的项目中,尝尝看到bundle.js,例如d3/bundle.js 内容: 请问这个bundle.js是有什么用呢?

  • 问题内容: 打印char数组不显示哈希码: 输出: 为什么将整数数组打印为哈希码而不是char数组? 问题答案: 首先,就像其他任何类型的数组一样,char数组是Java中的Object。只是以不同的方式打印。 (这是实例的类型)具有用于字符数组的特殊版本--因此不必调用该数组。最终调用,将数组的字符写入输出流。 这就是为什么对a调用println与对其他类型的数组调用它的行为有所不同的原因。对于

  • 问题内容: 我已经看到了声明,接口和类 这是什么意思? 问题答案: 没有证据,我相信您在谈论Java的泛型支持… 泛型允许您抽象类型 在Java 5之前,很难提供能够支持多种不同类型的Objects的类而不必为每种特定情况编写代码,因此人们通常会这样做。 这导致在运行时做出许多困难的选择,您必须进行运行时检查以查看是否有可能将给定的Object强制转换为可用类型…例如 现在,这已经很明显了,但是如