Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在对象实例化时将变量名拉入构造函数_Javascript_Oop - Fatal编程技术网

Javascript 在对象实例化时将变量名拉入构造函数

Javascript 在对象实例化时将变量名拉入构造函数,javascript,oop,Javascript,Oop,下面是一个示例构造函数 function AnObject(a, b){ this.a = a; this.b = b; } 以及它的一个实例 var example = new AnObject('test', 'test'); 假设构造函数有一个属性.name 是否需要构建构造函数,以便将对象的名称设置为实例化时使用的变量的名称 在上述情况下,名称将为example -编辑- 我之所以努力做到这一点,是为了尽可能做到“D.R.Y” 我希望不必: var example =

下面是一个示例构造函数

function AnObject(a, b){
    this.a = a;
    this.b = b;
}
以及它的一个实例

var example = new AnObject('test', 'test');
假设构造函数有一个属性
.name

是否需要构建构造函数,以便将对象的名称设置为实例化时使用的变量的名称

在上述情况下,名称将为
example

-编辑-

我之所以努力做到这一点,是为了尽可能做到“D.R.Y”

我希望不必:

var example = new ObjectWithName('example');
是否需要构建构造函数,以便将对象的名称设置为实例化时使用的变量的名称

使用创建新对象时

new AnObject('test', 'test')
这将产生一个对象引用,然后可以直接使用:

(new AnObject("test","test")).a
或丢弃

 new AnObject('test', 'test')
或指定给其他对象属性:

 myotherobject["b"]=new AnObject('test', 'test')
或被推入阵列中:

 myarr.push(new AnObject('test', 'test'))
或者一次分配给多个变量

a=b=c=d=e = new AnObject('test', 'test');
您的构造函数无法知道对象(引用)将以何种方式使用,也无法知道将分配给它的变量的名称(在简单变量分配的情况下)

换句话说,创建对象和使用结果对象引用执行操作是两个完全独立的操作

因此,除非将“name”值作为参数显式传递到构造函数中:

var example = new AnObject('example','test','test')
或者以后再设置

example.name="example"
你不可能做到这一点

是否需要构建构造函数,以便将对象的名称设置为实例化时使用的变量的名称

使用创建新对象时

new AnObject('test', 'test')
这将产生一个对象引用,然后可以直接使用:

(new AnObject("test","test")).a
或丢弃

 new AnObject('test', 'test')
或指定给其他对象属性:

 myotherobject["b"]=new AnObject('test', 'test')
或被推入阵列中:

 myarr.push(new AnObject('test', 'test'))
或者一次分配给多个变量

a=b=c=d=e = new AnObject('test', 'test');
您的构造函数无法知道对象(引用)将以何种方式使用,也无法知道将分配给它的变量的名称(在简单变量分配的情况下)

换句话说,创建对象和使用结果对象引用执行操作是两个完全独立的操作

因此,除非将“name”值作为参数显式传递到构造函数中:

var example = new AnObject('example','test','test')
或者以后再设置

example.name="example"

你不可能做到这一点。

不。恐怕那是不可能的

你看,语句
var-example=newanobject('test','test')从右向左求值。因此,首先对新对象('test','test')
进行评估。然后,它返回的值被分配给
var-example


由于这种从右到左的求值方式,您的
一个对象
构造函数不可能知道它的返回值将在求值时分配给变量
示例

不。恐怕这是不可能的

你看,语句
var-example=newanobject('test','test')从右向左求值。因此,首先对新对象('test','test')
进行评估。然后,它返回的值被分配给
var-example


由于这种从右到左的求值方式,你的
一个对象
构造函数不可能知道它的返回值将在求值时分配给变量
示例

哦,现在我读了你的答案,我明白了这个问题@这真的不可能在构造函数上单独完成。哦,现在我读了你的答案,我明白了这个问题@Panomosh这真的不可能在构造函数上单独完成。如果我
使用strict
来消除JS提升问题呢?(或
var-example;
example=new-AnObject…
)@Panomosh:我不认为这两种方法都会有什么不同,也不会帮助您的构造函数计算出它的返回值将分配给什么。好的,只是想知道这是否是“从右向左”的一种潜在解决方法:)@Panomosh:恐怕这件事真的没有解决办法。是的,我知道这很糟糕:-p如果我
使用strict
删除JS提升问题会怎么样?(或
var-example;
example=new-AnObject…
)@Panomosh:我不认为这两种方法都会有什么不同,也不会帮助您的构造函数计算出它的返回值将分配给什么。好的,只是想知道这是否是“从右向左”的一种潜在解决方法:)@Panomosh:恐怕这件事真的没有解决办法。是的,我知道这很糟糕