为什么原型未定义

2024-01-26

我知道这个问题已经被问过数百次了,但是,我似乎无法理解这个概念prototype

这是我的示例脚本

var config = {
  writable: true,
  enumerable: true,
  configurable: true
};

var defineProperty = function(obj, name, value) {
  config.value = value;
  Object.defineProperty(obj, name, config);
}


var man= Object.create(null);
defineProperty(man, 'sex', "male");

var person = Object.create(man);
person.greet = function (person) {
    return this.name + ': Why, hello there, ' + person + '.'
}
var p=Object.getPrototypeOf(person);
alert(p.sex);//shows male
person.prototype.age=13;//why there is a error said the prototype is undefined? I thought it supposed be man object...

var child=function(){}
child.prototype.color="red";//why this line doesn't show error? both child and person are an object . 

alert(child.prototype.color);//shows red

var ch=Object.getPrototypeOf(child);

alert(ch.color);//why it is undefined? it is supposed red.

希望你能给我一些帮助...谢谢。

Updated:

谢谢你们的帮助,根据 Elclanrs 的回答,以下是我了解到的内容。

Function是 javascript 中的内置对象之一。 3种格式创建函数对象是相等的。

var function_name = new Function(arg1, arg2, ..., argN, function_body)
function function_name(arg1, arg2, ..., argN)
{
...
}
var function_name=function(arg1, arg2, ..., argN)
{
...
}

因此,这就是为什么创建原型链时我们必须创建一个函数,然后使用 new 关键字调用它。

Function.prototype是对所有 Function 对象的引用prototype.

Cheers


The prototype属性仅存在于函数上,并且person不是一个函数。这是一个object.

这是发生的事情:

var man = Object.create(null);         // man (object) -> null
man.sex = "male";

var person = Object.create(man);       // person (object) -> man (object) -> null
person.greet = function () { ... };

var p = Object.getPrototypeOf(person); // man (object) -> null
alert(p.sex);                          // p is the same object as man

person.prototype.age = 13;             // person doesn't have a prototype

var child = function () {};            // child (function) -> Function.prototype
                                       // -> Object.prototype -> null
child.prototype.color = "red";         // child has a prototype

var ch = Object.getPrototypeOf(child); // Function.prototype

alert(ch.color);                       // ch is not the same as color.prototype
                                       // ch is Function.prototype

欲了解更多信息,我建议您阅读这个答案:https://stackoverflow.com/a/8096017/783743 https://stackoverflow.com/a/8096017/783743

Edit:用尽可能少的语言解释发生的事情:

  1. JavaScript 中的所有内容都是对象,除了原始值(布尔值、数字和字符串)之外null and undefined.

  2. 所有对象都有一个属性称为[[proto]]这是程序员无法访问的。然而,大多数引擎都可以通过以下方式访问此属性:__proto__.

  3. 当你创建一个像这样的对象时var o = { a: false, b: "something", ... } then o.__proto__ is Object.prototype.

  4. 当你创建一个像这样的对象时var o = Object.create(something) then o.__proto__ is something.

  5. 当你创建一个像这样的对象时var o = new f(a, b, ...) then o.__proto__ is f.prototype.

  6. 当 JavaScript 找不到属性时o它搜索该属性o.__proto__进而o.__proto__.__proto__等等,直到它找到该属性或原链以null(在这种情况下,该属性是undefined).

  7. 最后,Object.getPrototypeOf(o)回报o.__proto__并不是o.prototype - __proto__存在于所有对象上,包括函数,但是prototype只存在于函数上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么原型未定义 的相关文章

随机推荐

  • Web API Core 2.2 中的延迟加载

    我遇到了延迟加载的问题 我有以下 dbcontext public virtual DbSet
  • 如何从查询字符串中获取参数值?

    如何在routes jsx文件中定义路由来捕获 firebase request key从 Twitter 的单点登录进程在从其服务器重定向后生成的 URL 中的参数值 http localhost 8000 signin k v9ifuf
  • 在 Symfony2/Twig 中使用 JavaScript

    我有一个名为 contact html twig 的视图 它有一个带有一些文本字段的表单 我想使用 javascript 来验证没有任何字段为空 以及一些其他规则 但我不知道将 js 和定义放在哪里 我也不知道如何使用 Twig 表示法调用
  • 批处理文件:从串口接收数据并将其写入txt文件

    我正在尝试通过 USB 串行端口从 Arduino 提取一些数据并将其写入 txt 文件 因此 我使用批处理文件 Windows 7 普通cmd 它发送例如 d 从 Arduino 请求所需的数据 收到 d 后 Arduino 开始向 PC
  • 在没有窗口的情况下进行屏幕截图

    我一直在研究 Son Of Grab Apple 演示 我真的很难获得没有任何窗口 只有桌面 扩展坞和菜单栏 的屏幕截图 有谁知道该怎么做 下面是一些示例代码 仅使用桌面进行屏幕截图 CFArrayRef onScreenWindows C
  • 使用带有范围说明符而不是字节的 HTTP 范围标头?

    核心问题是关于HTTP headers的使用 包括Range http www w3 org Protocols rfc2616 rfc2616 sec14 html sec14 35 If Range http www w3 org Pr
  • Eclipse 无法启动但没有显示错误

    知道为什么我的 Eclipse 没有启动吗 The eclipse ini有以下内容 startup plugins org eclipse equinox launcher 1 1 0 v20100507 jar launcher lib
  • Django:为生产中的网站设置高效的日志系统

    好的 开发阶段已经结束 现在我的网站已上线 但是 我还没有设置日志记录 我的网站位于 var www html 目录 理想情况下 我想让 Django 登录 var log django 但这需要权限 将 Django 日志保存在 var
  • Android Chrome 浏览器不必要地重命名下载文件的名称和类型

    我想我会重新发布这个 因为我有更详细的信息 问题 Android Chrome 浏览器在所有情况下都会将文件重命名为 下载 在某些情况下 它会将类型重命名为 bin 例如 如果扩展名是 MOV 正如我之前提到的 同一 Android 设备上
  • 在pyspark中合并两个RDD

    假设我有以下 RDD a sc parallelize 1 2 5 3 b sc parallelize a c d e 如何将这 2 个 RDD 合并为一个 RDD 如下所示 a 1 c 2 d 5 e 3 Using a union b
  • 重用的 React 元素会阻止组件更新

    Foo是一个只应该渲染一次的组件 这可以用于性能优化 尽管这纯粹是理论问题 不解决任何特定的编码问题 这可以通过使用来实现shouldComponentUpdate或纯组件 这是推荐的方法 const Foo gt p Math rando
  • dask 和 pandas 数据帧中 apply 的不兼容性

    的一个样本triggers我的专栏Dask数据框看起来像下面这样 0 Total Traffic DNS UDP 1 TCP RST 2 Total Traffic 3 IP Private 4 ICMP Name triggers dty
  • 运行时出错 01 46,响应:...UNABLETOCONNECT

    通过蓝牙成功从 OBD II 模拟器获取数据到 Android 应用程序 现在我正在尝试将数据从 ELM327 设备获取到 Android 应用程序 我的汽车上连接了一个 ELM327 设备 蓝牙连接是由于 ECU 连接失败并出现无法连接错
  • 我应该将 .vscode 文件夹提交到源代码管理吗?

    Is the vscode文件夹是否要提交给源代码管理 在新项目中 该文件夹是空的 除了settings json文件 这个文件夹里会放什么东西 它是特定于机器的 特定于开发人员的吗 vs文件夹 从而不被提交 或者所有开发人员都应该共享这个
  • 确定安装的是哪个版本的 SharePoint?

    确定安装的 SharePoint 版本的最可靠方法是什么 无论是WSS还是MOSS 如果是MOSS 不管是标准的还是企业的 我想以编程方式检测安装的确切 SharePoint 版本 PS 我已经发过了SharePoint SE 上的这个问题
  • Django 多个动态数据库

    我一直在评估 django 并想知道以下是否可能 我已经查看了常规的多个数据库文档 因此请不要向我指出这一点 因为据我所知 尚未提及此用例 如果我错了 我收回它 我想要一个主数据库 其中驻留我的应用程序的大部分模型 但是其中一个应用程序需要
  • 如何整合我的 Xcode 项目文件?

    当我开始开发我的第一个应用程序时 我假设将文件拖到 xcode 中会将它们放入我的项目的实际目录中 并非如此 显然 Xcode 在桌面上引用了它们 有没有一种简单的方法将所有引用的文件复制到项目目录中 我的桌面很乱 使用 Finder 将所
  • Symfony2 - 以编程方式设置记住我 cookie

    我通过新的 simple form 功能实现了自定义身份验证器 main pattern simple form authenticator custom authenticator provider fos userbundle csrf
  • 调试 ASP.NET 会话状态服务器问题

    我们有一个在负载平衡服务器实例上运行的应用程序 因此配置为使用 ASP NET 会话状态服务 该服务在我们的一台数据库服务器上运行 虽然我们应用程序的两个实例都可以成功连接到状态服务器 但会话状态数据的更改并未在它们之间反映出来 FI 如果
  • 为什么原型未定义

    我知道这个问题已经被问过数百次了 但是 我似乎无法理解这个概念prototype 这是我的示例脚本 var config writable true enumerable true configurable true var defineP