Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在javascript中使用[apply] & [new]来创建对象?

在javascript中使用[apply] & [new]来创建对象?
EN

Stack Overflow用户
提问于 2014-03-15 08:55:24
回答 3查看 192关注 0票数 1

我读过关于使用很好的问题apply来动态创建对象的文章。

确切的问题是:

我希望创建一个对象实例(通过新操作符),但是将任意数量的参数传递给构造函数。这有可能吗

关于已选择的答案,我有一个问题:

代码语言:javascript
运行
AI代码解释
复制
/*1*/   function construct(constructor, args) {
/*2*/       function F() {
/*3*/           return constructor.apply(this, args);
/*4*/       }
/*5*/       F.prototype = constructor.prototype;
/*6*/       return new F();
/*7*/   }

(工作jsbin)

一切都好。

我尝试将第3行移到第6行:所以最后的输出是:

代码语言:javascript
运行
AI代码解释
复制
/*1*/   function construct(constructor, args) {
/*2*/      // function F() {
/*3*/      //     return constructor.apply(this, args);
/*4*/      // }
/*5*/       //F.prototype = constructor.prototype;
/*6*/       return new constructor.apply(this, args);
/*7*/   }

(-working jsbin)

我的问题是为什么第二个例子行不通?有什么区别吗?

我所做的就是把代码从一个地方移到另一个地方。

示例:

代码语言:javascript
运行
AI代码解释
复制
function calc()
{
   function a() {return 4};

 return a(); // I could easily do `return 4` instead...;
}

问题

为什么移动的代码不能工作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-15 11:11:17

你说:

代码语言:javascript
运行
AI代码解释
复制
function construct(constructor, args) {
  function F() {
    return constructor.apply(this, args);
  }
  F.prototype = constructor.prototype;
  return new F();
}

应与下列事项相同:

代码语言:javascript
运行
AI代码解释
复制
function construct(constructor, args) {
  return new constructor.apply(this, args);
}

但它实际上在以下几个基本方面有所不同:

1. constructor.apply是一个本机非构造函数.New只能从构造函数创建对象:

..。对象可以被创建..。通过构造函数创建对象,然后通过为其属性分配初始值来执行初始化全部或部分对象的代码。每个构造函数都有一个名为“prototype”的属性,用于实现基于原型的继承和共享属性。对象是通过在新表达式中使用构造函数创建的.

http://www.ecma-international.org/ecma-262/5.1/#sec-4.2.1

另一方面,F是一个功能对象。所有函数对象都可以用作构造函数。

注意: Alon说new constructor.apply(this, args)不能工作,因为constructor.apply(this, args).prototype没有定义。这不是真的。如果是这样,将意味着函数调用操作符的优先级高于新运算符(即‘newconstructor.apply(this,args)与new (constructor.apply(this,args))’) 这不是真的

2.,即使constructor.apply是构造函数,它也不同于constructor.prototypeF的原型设置为constructor's原型,以确保通过新操作符与F组合创建的所有对象与与constructor组合创建的对象相同。Fconstructor的唯一不同之处在于它们是不同的函数,从而使得F能够以更灵活的方式调用constructor

constructor.apply.prototype实际上可以设置为constructor.prototype,但constructor.apply仍然不能用作构造函数。

3.语句中的this参数不是指向新创建的对象,而是指向本地作用域中的this。因此,即使您可以使用apply函数作为构造函数,并将apply's原型设置为constructor's原型,您仍然会将错误的this传递给constructor函数。

注:示例中的

代码语言:javascript
运行
AI代码解释
复制
function calc()
{
   function a() {return 4};
   return a(); // I could easily do `return 4` instead...;
}

return可以与任何类型的表达式一起使用,而new不能。

票数 1
EN

Stack Overflow用户

发布于 2014-03-15 09:02:28

你还得告诉它才能使用父原型。

此外,将其指定为使用扩展构造函数也是一个好主意。

在功能之外,

代码语言:javascript
运行
AI代码解释
复制
construct.prototype = Object.create(constructor.prototype);
construct.prototype.constructor = construct;

编辑:

在第二个函数中,您试图创建一个已经实例化的对象的新实例。

应该用new调用构造函数。

http://jsbin.com/modiqoha/7/edit

票数 0
EN

Stack Overflow用户

发布于 2014-03-15 09:12:44

执行代码new foo(...)时,将创建一个新对象,从foo.prototype继承。

你想做的事:

代码语言:javascript
运行
AI代码解释
复制
return new constructor.apply(this, args);

..。不工作,因为constructor.apply(this, args).prototypeundefined

原始construct函数仍然工作的原因是:

代码语言:javascript
运行
AI代码解释
复制
F.prototype = constructor.prototype;

因为当你做return new F();时,F仍然有一个原型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22426816

复制
相关文章
C/C++未定义行为
下面是一段代码,这段代码中有标准未定义的行为。代码如下: #include<iostream> using namespace std; int main() { int j = 0;
zy010101
2020/04/16
3.7K0
气流组织优化—数据中心节能的魔术手
引言 1946年数据中心诞生于美国,至今已经历4个阶段近70年的发展历程,数据中心从最初仅用于存储的巨型机,逐渐转向多功能、模块化、产品化、绿色化和智能化。在越来越注重节能和精细化的今天,数据中心的每一个细节设计都闪耀着工程师智慧的光芒。他们对于数据中心的规划设计,不再满足于仅停留在功能这一基本的要求上,现在的数据中心你会看到更多关于节能环保及工程之美、绿色之美等设计理念。 评价数据中心的优劣,与其提供的服务质量,成本控制及绿色程度密切相关。能够提供稳定及具备高可用性的服务是对云服务商和数据中心的基本要求。
腾讯数据中心
2018/03/16
2.6K0
气流组织优化—数据中心节能的魔术手
解决调用未定义 swoole_async_readfile函数问题
https://github.com/swoole/swoole-src/issues/2439
全栈程序员站长
2022/07/11
4.1K0
解决调用未定义 swoole_async_readfile函数问题
c++使用了未定义类型_c++如何新建
第一个参数是一个指向SECURITY_ATTRIBUTES结构体的指针,一般的情况下,可以是nullptr。
全栈程序员站长
2022/11/09
2.7K0
IE11出现"__doPostBack”未定义
  系统做迁移,在新服务器IIS上部署,部署后的系统在IE8和其他浏览器上显示正常,
_一级菜鸟
2020/07/22
2.6K0
优雅地创建未定义类PHP对象
在PHP中,如果没有事先准备好类,需要创建一个未定义类的对象,我们可以采用下面三种方式:
硬核项目经理
2019/11/21
2.9K0
ubuntu gcc编译时对’xxxx’未定义的引用问题
http://www.cnblogs.com/oloroso/p/4688426.html
bear_fish
2018/09/19
8.3K0
[Error] invalid use of incomplete type 使用了未定义的类型
今天在写奥特曼打大怪兽的时候,发现一个奇怪的问题,我定义了两个基类Ultraman和Monster,一个Monster的子类Boss,然后两个基类是有相互勾结的地方,它们都或多或少的使用了对方的类型进行定义自己,然后我在第一个类实现前面进行了另一个类的声明:
叶茂林
2023/07/30
5590
[Error] invalid use of incomplete type 使用了未定义的类型
Array find方法在UC浏览器未定义
今天发现用UC浏览器访问一个项目出现bug,后来检查出来原来UC浏览器并没有find方法(但它有filter方法),所以写了以下垫片。。。
javascript.shop
2019/09/04
2.7K0
C 和 C++ 中的未定义行为
theme: channing-cyan highlight: a11y-dark
鲸落c
2022/11/14
4.5K0
Oracle中日期字段未定义日期类型的案例一则
可能很多开发规范中都写了日期类型的字段,应该就是用标准的日期类型定义,不要用字符串、数值型等替代,相关历史文章,如下所示,
bisal
2022/05/14
3.4K0
[毕设] 更大尺度下自装配规律探索-基于于乒乓球的气流无序装配实验
从DNA转录mRNA,再通过核糖体根据mRNA中碱基序列,将氨基酸组成肽链,肽链盘曲折叠形成蛋白质,组成细胞,构建肌体... 这一过程最为神奇之处,就是在于复杂的肌体,功能各异的器官,都是来自于同样DNA序列,也都经历了这样一个“生命装配”的自发过程。通过碱基对ATCG的排列组合,组成了我们这个复杂生物世界。
UDM Lab
2020/04/20
6460
Java-方法重载时 调用未定义的对象属性
public class TestWayReload { int id; String name; String pwd; public TestWayReload(){ System.out.println(“Hellow World!”); System.out.println("################"); }
Fisherman渔夫
2019/07/30
5.7K0
实现nest中未定义参数的入参校验
当我们在dto层定义好参数字段后,客户端在调用时传入了未定义的字段,此时我们需要报错告知客户端这个字段不存在,在nest中默认不会报错,本文将分享这个问题的解决方案,欢迎各位感兴趣的开发者阅读本文。
神奇的程序员
2022/04/10
3.5K0
实现nest中未定义参数的入参校验
vue在IE下无法正常工作,Promise未定义?
用vue写了一个日历组件,在Firefox、Edge、Chrome以及360等浏览器极速模式中运行一切正常,如图:
Yiiven
2022/12/15
4.3K0
vue在IE下无法正常工作,Promise未定义?
TiKV + Flink = 最佳人气流批一体库|TiDB Hackathon 2020 优秀项目分享
近日,由 TiDB 社区主办,专属于全球开发者与技术爱好者的顶级挑战赛事——TiDB Hackathon 2020 比赛圆满落幕。今年是 TiDB Hackathon 第四次举办,参赛队伍规模创历届之最,共有 45 支来自全球各地的队伍报名,首次实现全球联动。经过 2 天时间的极限挑战, 大赛涌现出不少令人激动的项目。为了让更多小伙伴了解这些参赛团队背后的故事, 我们开启了 TiDB Hackathon 2020 优秀项目分享系列,本篇文章将介绍 TiFlink 团队赛前幕后的精彩故事。
PingCAP
2021/02/22
6670
TiKV + Flink = 最佳人气流批一体库|TiDB Hackathon 2020 优秀项目分享
ThinkPHP报错“未定义数组索引”原因与解决方法
但是,大家有必要知道:thinkphp这个文件夹是框架的核心目录,一般我们是没必要修改的。要是框架核心文件报错,有可能是PHP版本的问题。
阿哲
2022/03/13
7.3K0
最新电子皮肤的触觉有多灵?连空气流动都能感受到
而如何让电子皮肤感受不同物体表面的差异,摸出不同粗糙度的那种,一直是个不小的挑战。
量子位
2021/07/19
3870
「我读」PL 观点 | 未定义行为有利的一面
Rust 官方团队 Ralf Jung 在 PL 观点 (PL Perspectives) 博客[1] 上发表了一篇文章 《Undefined Behavior deserves a better reputation》[2] ,文中对UB(未定义行为)有利的一面进行了详细的阐述。通过这篇文章,我们可以对UB 有更深入的理解。
张汉东
2021/11/25
1.7K0
点击加载更多

相似问题

当图像太大时,如何使用imagemagick来调整大小?

12

只有当图像太大时才调整图像大小

13

如果太大则调整图像大小

11

如果图像太大,请调整div的大小

10

当滚动时,UITableViewCell图像会被调整大小

34
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档