function Test(){
var aVariable =1;
this.bVaribale = 2;
this.say = function(){
console.log(this.bVaribale);
}
}
var t1 = new Test();
var t2 = Test.constructor();
t1.say();
t2.say();
最后一行产生Uncaught TypeError: t2.say is not a function(…)
如何通过构造函数属性调用函数构造函数?
答案 0 :(得分:0)
应该......
function Test(){
this.bVariable = 2;
this.say = function(){
console.log(this.bVariable);
}
}
var t1 = new Test();
var t2 = new Test.prototype.constructor();
// or var t2 = new t1.constructor();
// both work
t1.say();
t2.say();
请参阅,Test
本身是一个很好的对象(一个函数,具体而言)。使用Test.constructor
,您可以访问此对象的构造函数 - 全局Function
函数:
console.log(Test.constructor === Function); // true
您似乎在查找使用constructor
创建的对象的Test
属性。这意味着您应该查询t1.constructor
(如果您知道这些对象),或Test.prototype
如果您知道函数本身。后一种情况似乎很奇怪(通过something
访问something.prototype.constructor
有什么好处?)
请注意,您仍应在此处使用new
关键字来设置正确的上下文。另一种方法是使用ES6 Reflect API - 更具体地说,Reflect.construct:
var t2 = Reflect.construct(Test, []);
......似乎已经在主流浏览器中实现了。
答案 1 :(得分:0)
public void UseComboBoxForEnumsAndBools(DataGridView g)
{
g.Columns.Cast<DataGridViewColumn>()
.Where(x => x.ValueType == typeof(bool) || x.ValueType.IsEnum)
.ToList().ForEach(x =>
{
var index = x.Index;
g.Columns.RemoveAt(index);
var c = new DataGridViewComboBoxColumn();
c.ValueType = x.ValueType;
c.ValueMember = "Value";
c.DisplayMember = "Name";
c.DataPropertyName = x.DataPropertyName;
c.HeaderText = x.HeaderText;
c.Name = x.Name;
if (x.ValueType == typeof(bool))
{
c.DataSource = new List<bool>() { true, false }.Select(b => new
{
Value = b,
Name = b ? "True" : "False" /*or simply b.ToString() or any logic*/
}).ToList();
}
else if (x.ValueType.IsEnum)
{
c.DataSource = Enum.GetValues(x.ValueType).Cast<object>().Select(v => new
{
Value = (int)v,
Name = Enum.GetName(x.ValueType, v) /* or any other logic to get text */
}).ToList();
}
g.Columns.Insert(index, c);
});
}
属性指向用于构造您访问public enum MyEnum { First, Second, Third }
private void Form1_Load(object sender, EventArgs e)
{
var dt = new DataTable();
dt.Columns.Add("C1", typeof(bool));
dt.Columns.Add("C2", typeof(MyEnum));
dt.Columns.Add("C3", typeof(string));
dt.Rows.Add(true, MyEnum.First, "string");
this.dataGridView1.DataSource = dt;
UseComboBoxForEnumsAndBools(this.dataGridView1);
}
的实例的构造函数。
这不是内部[[Construct]]方法!
由于constructor
是constructor
,Test
。
您可能需要Function
代替:
Test.constructor === Function
答案 2 :(得分:0)
将内置属性称为内置属性并非最佳做法。 为了达到目标,你可以这样做:
function Test() {
return {
create: function() {
return new Test();
}
};
}
并称之为
Test().create()