如何通过构造函数属性而不是new来调用函数构造函数

时间:2016-11-28 11:32:44

标签: javascript constructor

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(…)

如何通过构造函数属性调用函数构造函数?

3 个答案:

答案 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]]方法!

由于constructorconstructorTest

您可能需要Function代替:

Test.constructor === Function

答案 2 :(得分:0)

将内置属性称为内置属性并非最佳做法。 为了达到目标,你可以这样做:

function Test() {
   return {
     create: function() {
       return new Test();
     }
   };
}

并称之为

Test().create()