原型编程中对象和原型有什么区别?

2024-01-25

我试图理解创建和使用对象的“JavaScript 方式”,但我认为我对对象和原型产生了误解。

在我开始的一个新项目中,我决定尝试原型继承。我很困惑,这是否意味着我应该创建一个我打算使用的对象,然后基于该对象创建其他对象Object.create()例如:

var labrador = {
   color: 'golden',
   sheds: true,

   fetch: function()
   {
      // magic
   }
};

var jindo = Object.create(dog);
jindo.color = 'white';

或者,如果我应该创建一种类并使用它创建该类的实例Object.create().

var Dog = { // Is this class-like thing a prototype?
   color: null,
   sheds: null,

   fetch: function()
   {
      // magic
   }
};

var labrador = Object.create(Dog);
labrador.color = 'golden';
labrador.sheds = true;

var jindo = Object.create(Dog);
jindo.color = 'white';
jindo.sheds = true;

在基于类的 OOP 方面有更多的经验,后一种方法对我来说感觉更舒服(也许这就是足够的理由)。但我觉得原型继承的精神更多的是在第一个选择中。

哪种方法更符合原型编程的“精神”?或者我完全没有抓住要点?


The prototype只是一个对象具有隐式引用的另一个对象。

当你这样做时:

var obj = Object.create( some_object );

……你是说你想要obj尝试从中获取属性some_object,当它们不存在时obj.

因此,您的第二个示例将更接近您的使用方式。使用创建的每个对象Object.create(Dog)将在其原型链, that Dog目的。所以如果你做出改变Dog,更改将反映在所有具有Dog在链中。

如果主对象具有与原型对象相同的属性,则该属性是影子原型的该属性。一个例子是null您在属性上设置的值Dog.

如果你这样做:

var lab = Object.create(Dog);
lab.color = 'golden';

...你现在正在跟踪color属性于Dog,所以你将不再得到null。你是not改变Dog无论如何,如果我创建另一个对象:

var colorless_dog = Object.create(Dog);

...这个仍然会得到null访问原型链时的值color财产。

colorless_dog.color;  // null

...直到你遮蔽它:

colorless_dog.color = 'blue';
colorless_dog.color;  // 'blue'

所以给出你的例子:

var lab = Object.create(Dog);
lab.color = 'golden';
lab.sheds = true;

...它看起来像这样:

              // labrador              // Dog
lab.color---> color:'golden'           color:null
lab.sheds---> sheds:true               sheds:null

lab.fetch()--------------------------> fetch: function() {
                                          alert( this.color ); // 'golden'
                                          // "this" is a reference to the
                                          //    "lab" object, instead of "Dog"
                                       }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原型编程中对象和原型有什么区别? 的相关文章

  • 调用“DOMNodeInserted”事件时添加元素

    我想在每个 喜欢 按钮 chrome 扩展 之后添加一个元素 由于帖子被添加到新闻提要而不刷新页面 我必须添加一个事件侦听器 DOMNodeInserted 但是当我尝试把after 里面的功能 它不起作用 Code contentArea
  • 使用selenium IDE提取部分文本并将其放入变量中

    有人可以告诉我应该使用哪个命令来使用 Selenium Ide 从文本中仅提取数字 694575 并将其放入变量中以供进一步使用 这是带有文本的 div div class loginBoxTitle Edit Exhibition Cen
  • 如何理解 Angular JS 中的控制台错误消息?有什么工具吗?

    我是 Angular JS 的新手 我的第一个问题是如何理解 Angular JS 中控制台的错误消息 我编写了这段用于匹配密码的代码片段 它在控制台上抛出错误 但它工作正常 它是有线的 我无法从这些控制台消息中理解任何内容 谁能指出我为什
  • 如何将中间件绑定到socket.io中的事件

    现在您可以将中间件绑定到io use middleware 但这仅在建立套接字连接时触发 有没有办法在将其传递给事件句柄之前拦截它 就像在expressjs中一样 换句话说 In 快递 js你可以做 app get middleware1
  • v-file-input .click() 不是函数

    我试图以编程方式触发 v file input 的 click 事件 因为它在 Vuetify 的文档中 但它显示一个错误this refs imagePicker click is not a function我在这里错过了什么吗 代码重
  • KeyboardEvent.keyCode 已弃用。这在实践中意味着什么?

    根据 MDN 我们绝对应该not正在使用 keyCode财产 它已被弃用 https developer mozilla org en US docs Web API KeyboardEvent keyCode https develope
  • 如何清除WebGL中的矩形区域?

    WebGL 有一个clear清除整个表面的方法 清除表面的特定矩形的最佳方法是什么 例如 我想将一个从 50 50 开始的 100x100 像素框设置为全零 ARGB 0 0 0 0 我现在能想到的就是用一个写入零的片段着色器绘制一个四边形
  • 使水平滚动条始终可见,即使底部不在视图中

    我将用一个片段来开始这个问题 该片段几乎显示了我想要完成的任务 wrapper overflow hidden display flex sidebar min width 200px background 333 color FFF co
  • React无限滚动scrollableTarget动态获取id?

    我在我的项目中使用react infinite scroll component 如何让scrollableTarget动态获取item id 我试过这样scrollableTarget item id 但它不起作用 必须与该 div 具有
  • 如何在 e2e AngularJS 测试中进行文件上传?

    在我的一种观点中 我有一个文件上传控件 它支持通过拖放或单击按钮后打开的标准文件对话框上传文件 How to do this in my e2e tests1 1 Just one of the two options will be en
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • Jquery:选择菜单以显示和隐藏某些div元素

    我正在创建一个选择菜单 根据所选选项显示和隐藏某些 div 像这样的东西
  • ng-model 和值组合不适用于输入文本框

    我有两个输入文本框 我需要组合在两个文本框中输入的值并将其显示在第三个文本框中 如果我只使用value在第三个文本框中 Box 1
  • 您如何看待引导模式触发器的相应回调?

    On 引导模态 http getbootstrap com javascript modals 我们知道我们可以为触发器绑定事件 例如show or hide using show shown hide hidden 但此事件绑定仅适用于一
  • 在javascript中动态生成行?

    我是 javascript 新手 我想在按下 Tab 时动态生成行 并希望获取在动态生成的行中输入的值 以便我可以在 servlet 代码中使用这些值 这是我的html
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • 如何更改订阅值?使用 rxJS

    我正在创建一个计时器 需要你的帮助 我刚刚学习 Angular 和 rxJS 对此我有一些疑问 我正在创建一个具有启动 停止 暂停 重置功能的计时器 并且 btn Reset 必须将我的计时器 暂停 到 300 毫秒 怎么做 D 我的启动定
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练
  • Bootstrap 3 / 显示模式不适用于 javascript 方式

    我用Modal http getbootstrap com javascript modalsBootstrap 3 0 的功能 我有这个代码 a href myNestedContent Open the modal containing
  • 如何调试 Gulp 任务?

    如何调试我的中定义的 gulp 任务gulpfile js使用诸如 Google Chrome 调试器之类的调试器逐行单步执行任务的代码 对于 Node js 6 3 版本 您可以使用 inspect flag https nodejs o

随机推荐

  • 在 WPF 中对 TextBox.Foreground 进行动画处理

    无论如何 有没有动画TextBox ForegroundProperty
  • Pytorch softmax:使用什么维度?

    功能torch nn functional softmax有两个参数 input and dim 根据其文档 softmax 操作应用于所有切片input沿着指定的dim 并将重新调整它们以使元素位于范围内 0 1 并求和为 1 设输入为
  • 检查子对象的地址是否位于包含对象的范围内是否合法

    2个问题 以下代码的格式是否符合定义的行为 是否有任何可能的 C 实现可以断言 代码 c 11 及更高版本 include
  • 授予路径权限

    我正在关注这个guide https gorails com setup windows 10 安装 ruby 除了当我尝试运行此命令时 一切都没有问题 Rails 新 myapp d mysql 我在其中遇到了这个错误 run bundl
  • 单击按钮时如何更新列表视图?

    public class MainActivity extends Activity ListView list String abc 1 2 3 MyCustomAdapter adapter Button refresh Overrid
  • 仅当对象是文字时才按语言过滤

    我写了以下查询 SELECT DISTINCT predicate object label WHERE VALUES subject
  • Phonegap 2.6 与 KeyboardShrinksView 和 HideKeyboardFormAccessoryBar

    我对 2 6 ios 中的新 PhoneGap 功能之一有疑问 最后他们包含了一个缩小 WebView 以处理固定元素的选项 不幸的是 结合HideKeyboardFormAccessoryBar选项设置为 true 会出现一个奇怪的白色条
  • IValueConverter 并绑定 DependencyObject

    我有一个ComboBox我需要做一个转换器SelectedItem 问题是IValueConverter需要绑定值 但也需要一个集合 配置了一个DependencyObject但它给了我一个错误消息 类型 System Windows Da
  • 当电影绘制到画布中时 Android 错误信号 11

    我正在开发一个 Android 应用程序 我试图在其中显示 GIF 图像 为此 我使用 Movie 类并创建了一个扩展 View 的类 GIFView 我从 Movie decodeFile 方法获取 Movie 实例 调用 Movie d
  • WiX 主要升级 Windows 服务,保留 .config,并避免重新启动

    我正在努力让 MajorUpgrade ServiceControl config 文件能够很好地协同工作 在我提出其他问题之后 https stackoverflow com questions 22770414 wix majorupg
  • git-shell - 新存储库

    我有一台专门的服务器git用户和存储库我正在尝试使用git shell method http git scm com book en Git on the Server Setting Up the Server让我的开发人员能够从事多个
  • 使用反向引用作为重复计数的正则表达式

    有什么方法可以构造一个按如下方式工作的正则表达式 将整数匹配为组1 然后匹配 1整数 This d s d 1 不幸的是 这是不允许的 但我发现它很好地描述了我想要实现的目标 你可以做这样的事情 var numbers 3 7 6 5 4
  • cakephp 从另一个助手中访问助手

    如何使用我构建的新帮助程序方法访问另一个帮助程序 例如 FormHelper class AppHelper extends Helper public function generateSpecialInput return this g
  • 通过shiny + rgl捕获坐标

    是否可以使用 recognize3d 或类似的方法来捕获通过渲染 Rglwidget 渲染的 rgl 场景中的地标坐标 我在闪亮中使用以下代码进行渲染 server observeEvent input mspec3D tt1 lt out
  • 在页面之间导航时闪烁

    当我在页面之间导航时 我的phonegap jquery 移动应用程序大部分时间都会闪烁 这是正常现象还是有解决办法 ui page webkit backface visibility hidden 这对我在phonegap jquery
  • 使用 openCv c++ 复制图像的一部分

    我正在使用 opencv 我想从另一个图像的一部分创建一个图像 我没有找到这样做的函数 所以我尝试实现我的想法 其中包括逐像素复制图像 但徒劳地我没有得到我正在等待的结果 任何人都有另一种想法 Code include cv h inclu
  • fullcalendar 无法读取未定义的属性“fn”

    我嵌入了fullcalendar min js到我的项目 但我收到此错误 错误日志显示 无法读取未定义的属性 fn 见下图 我检查了这个问题 建议使用jQuery 2 0 0 并且我肯定会使用jQuery v3 3 1 但无助于问题的解决
  • React Native RNFetchBlob 下载后获取文件的 URI

    我正在开发一个 React Native 项目 我现在想做的是下载并将下载的文件保存到设备上 我正在使用这个包 https www npmjs com package rn fetch blob https www npmjs com pa
  • Eclipse:将编辑器与内容类型相关联

    我可以根据内容类型而不是单个文件类型更改编辑器关联吗 如果我去Window gt Preferences gt General gt Editors gt File Associations 我看到基于文件扩展名的文件类型列表 例如 单击
  • 原型编程中对象和原型有什么区别?

    我试图理解创建和使用对象的 JavaScript 方式 但我认为我对对象和原型产生了误解 在我开始的一个新项目中 我决定尝试原型继承 我很困惑 这是否意味着我应该创建一个我打算使用的对象 然后基于该对象创建其他对象Object create