Javascript:从已实例化的对象与原型创建对象

2024-05-04

我有一个相当学术的问题,并不特别适用于我正在做的任何事情,我只是真的想知道答案!

假设我们在全局命名空间中有一个简单的对象定义,如下所示:

TestObject = function(){};

它的原型中添加了一个方法,可以实例化为新对象本身:

TestObject.prototype.AnotherObject = function() {};

实例化第一个对象:

var myObject = new TestObject();

现在我的问题是这样的:

How does

myObject.myProperty = new myObject.AnotherObject();

不同于

myObject.myProperty = new TestObject.prototype.AnotherObject();

或者它们完全一样吗?

我看到的区别是:我可以使用第二种方法在 TestObject 上下文中实例化对象,而无需知道实例化对象本身的名称,即

TestObject.prototype.createAnObject = function() {
    this.anotherProperty = new TestObject.prototype.AnotherObject();
}

最后:

使用原型方法实例化同名对象有何含义?为什么这会导致无限循环? (里面到底发生了什么..)

TestObject.prototype.AnotherObject = function () {
    this.AnotherObject = new TestObject.prototype.AnotherObject();
};
myObject.AnotherObject();

然而这并不...

TestObject.AnotherObject = function() {};

TestObject.prototype.createAnObject = function() {
    this.AnotherObject = new TestObject.prototype.AnotherObject();
};
myObject.createAnObject();

...

我非常想了解这里物体之间的关系!谢谢你!

我问这些问题的原因是因为我想做一些类似的事情,其中​​对象之间存在 1:1 关系:

ClientObject = function () {
    this.objectname = "a client class";
}

ClientObject.prototype.loginUser = function(name) {
    this.loggedin = true;
    if (typeof this.User === 'undefined') {
        this.User = new ClientObject.User(name);
    }
}
ClientObject.User = function (name) {
    this.username = name;
}

ClientObject.User.prototype.getProfile = function() {
    return 'user profile';
}

var testClient = new ClientObject();

console.log('testClient.User = ' + (typeof testClient.User)); // should not exist
testClient.loginUser('Bob'); // should login 'bob'
console.log('testClient.User = ' + (typeof testClient.User)); // should exist now Bob is logged in
console.log(testClient.User.username); // should be bob
testClient.loginUser('Tom'); // should not do anything as User object already created
console.log(testClient.User.username); // bob still
console.log(testClient.User.getProfile()); // new functionality available

我只是不确定我是否无意中违反了任何最佳实践或惯例。


myObject.myProperty = new myObject.AnotherObject();

不同于

myObject.myProperty = new TestObject.prototype.AnotherObject();

完全没有区别。请记住,JavaScript 中的对象有一个原型链。你打电话时new myObject.AnotherObject();引擎将首先检查AnotherObject on myObject本身。找不到它,它将检查myObject的原型,它会找到它。第二个版本

myObject.myProperty = new TestObject.prototype.AnotherObject();

就直接去那个地方AnotherObject被定义为。


TestObject.prototype.AnotherObject = function () {
    this.AnotherObject = new TestObject.prototype.AnotherObject();
}
myObject.AnotherObject();

只需浏览一下代码即可。当你说:myObject.AnotherObject();, AnotherObject将被调用,与this set to myObject。第一行将尝试创建一个新属性myObject(这是this)通过将其设置为结果

new TestObject.prototype.AnotherObject(); 

然后将重新输入相同的AnotherObject函数,但这次是this设置为一个新对象,其原型设置为TestObject.prototype.AnotherObject的原型。等等无限期


最后,

TestObject.prototype.createAnObject = function() {
    this.AnotherObject = new TestObject.prototype.AnotherObject();
}
myObject.createAnObject();

Will not据我所知和测试,导致无限循环:FIDDLE http://jsfiddle.net/2w68B/

基本上,createAnObject将进入this set to myObject。其中有一个全新的房产,名为AnotherObject将在 myObject 上创建,该对象将被设置为对AnotherObject function您之前设置的。

请注意,进行此调用后,AnotherObject function will 仍然存在, but, 这将是shadowed by the AnotherObject property你刚刚创建的。所以现在你永远无法说

var f = new myObject.AnotherObject()

因为你现在有一个AnotherObject property位于 myObject 上,它将在检查原型上的任何内容之前找到并返回。

嗯,我的意思是,你总是可以说delete myObject.AnotherObject并从对象中删除该属性,然后您将可以看到AnotherObject在原型上找到,但实际上,您应该从一开始就避免这样的名称冲突。


关于你的最后一段代码

A)为什么不做User its own功能?
B) 为什么不设置this.User = new ...()就在 ClientObject 构造函数中吗?这样你就不需要undefined查看 C)ClientObject应定义为

function ClientObject(){...` 

你现在拥有的似乎正在创建一个隐式的全局。

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

Javascript:从已实例化的对象与原型创建对象 的相关文章

随机推荐

  • PHP 与 MySQL 中的资源 id #6 错误

    我这是为了我正在制作的投票系统 此代码向用户显示了他们可以从中选择的问题列表 div class main questions p class style1 style2 strong Select Your Question strong
  • 如何处理 Lollipop 5.1 上的快速滚动?

    背景 我制作了一个小型库 它展示了如何模仿 Android Lollipop 的股票联系人应用程序的风格 here https github com AndroidDeveloperLB ListViewVariants 问题 看来在And
  • 使用 xclip 将剪贴板内容粘贴到 bash 中的变量中

    我知道这个命令会将剪贴板内容粘贴到文件中 xclip out selection clipboard gt gt file txt 如果我想将剪贴板内容粘贴到变量 如字符串 中 我该怎么办 要将命令的输出分配给变量 可以使用命令替换 myv
  • .attr('disabled', 'disabled') 或 .attr('disabled', true) 用于禁用输入

    Both attr disabled disabled and attr disabled true 在我的代码中工作 但我只是想知道 两者中哪一个更有效和 或哪一个更常用 真的有区别吗 也许是性能方面 应该没有什么区别 但从 jQuery
  • WebRTC 暂停和恢复流

    我正在尝试使用 WebRTC 构建一个 Web 应用程序 当某些事件触发时需要暂停 恢复视频 音频流 我已经尝试过getTracks 0 stop 但我不知道如何恢复流 对此有什么建议吗 谢谢 getTracks 0 stop 是永久的 U
  • 如何避免在 std::pair 中“隐式”调用单参数构造函数

    最初的问题是如何与std map
  • 使用 SAML 2.0 进行 Scala Play Web 应用程序的 SSO

    我正在构建一个 scala play Web 应用程序 我需要使用支持 SAML v2 0 的 IdP 构建 SSO 功能 除了 SSO 之外 我还需要根据从 IdP 收到的角色 作为身份验证断言消息的属性 在应用程序内构建授权机制 我是
  • 为什么“not(True) in [False, True]”返回 False?

    如果我这样做 gt gt gt False in False True True 那返回True 仅仅是因为False在列表中 但如果我这样做 gt gt gt not True in False True False 那返回False 然
  • Golang 中的“相互”包导入

    是否可以在 Golang 中执行 相互 包导入之类的操作 举例来说 我有两个包 A 和 B 分别具有 AFunc 和 BFunc BFunc2 函数 package A import B func AFunc do stuff but al
  • 保存 Mongoose 文档时出现版本错误

    我有一个问题 不确定我是否做错了什么或者这是一个错误 我有一些产品 每一种都有一系列的变体 我想浏览一些数据并以这些变体加载它 但我遇到了许多 版本错误 找不到匹配的文档 错误 认为我遇到了竞争条件 我为我修改的每个变体依次保存相同的文档
  • d3.js V4 按钮缩放实现表现得很奇怪

    我正在尝试实现 d3 平移和缩放功能 默认的平移和缩放工作正常 但要求是我们还需要放大和缩小按钮 我还实现了缩放按钮 它也有效 奇怪的是 当我第一次移动图像并单击缩放按钮时 图像会移回到以前的位置 不仅是当我第一次用鼠标缩放并使用按钮再次开
  • 如何从计算函数内部更新其他字段或其他模型?

    有3个班级 sync test subject a与有很多关系sync test subject b继承自sync test subject c sync test subject b s separated chars字段通过称为的计算函
  • 使用 NumPy loadtxt/savetxt 指定编码

    使用 NumPyloadtxt and savetxt只要涉及非 ASCII 字符 函数就会失败 这些函数主要用于数字数据 但也支持字母数字页眉 页脚 Both loadtxt and savetxt似乎正在应用 latin 1 编码 我发
  • 将文件编码为 Base 64 Nodejs

    我使用下面的代码将文件编码为 Base64 var bitmap fs readFileSync file return new Buffer bitmap toString base64 我认为在文件中我们有问题 and 字符 但它很好
  • EntityFramework 6 中的 IDbCommandInterceptor 线程安全吗

    使用 DbInterception add 方法注册时 IDbCommandInterceptor 实例是否被视为线程安全 我已经实现了一个符合 IDbCommandInterceptor 接口的类 并且正在跟踪调用其中一个执行方法时命令的
  • Firemonkey - 更新视觉组件

    我们从版本 1 开始就使用 Firemonkey 但仍然发现更新当前在屏幕上可见的组件很困难 在 Firemonkey 中请求重画的 方式 有很多 也许太多了 应用样式 ApplyStyle 事件 主要是当它在屏幕上可见时 请求 repai
  • 这是一个有效的浮点数比较,它占了一定的小数位数吗?

    我正在编写一个扩展方法来使用一组小数点 有效数字 来比较两个浮点数 以确定它们是否相等而不是容差或百分比差异 浏览有关浮动比较的其他问题 我看到了复杂的实现 我是否过于简单化了或者这是否有效
  • CA1704 - 微软似乎屏蔽了“Multi”这个词?

    public class MultiSomething CA1704 IdentifiersShouldBeSpelledCorrectly 当我运行代码分析时 我收到错误 因为 Microsoft 无法识别 Multi 一词 想想他们在I
  • Emacs:结合 isearch-forward 和 center-top-bottom

    预先非常感谢您的帮助 在 Emacs 中 我喜欢使用 iseach forward C s 但如果突出显示的字体单词位于屏幕中间而不是最底部的中心 我会更喜欢它 我发现自己不断地这样做 C s foo C s C s C s 哦 这就是我一
  • Javascript:从已实例化的对象与原型创建对象

    我有一个相当学术的问题 并不特别适用于我正在做的任何事情 我只是真的想知道答案 假设我们在全局命名空间中有一个简单的对象定义 如下所示 TestObject function 它的原型中添加了一个方法 可以实例化为新对象本身 TestObj