如何让VS 2008的Javascript Intellisense支持复杂原型?

3

我已经成功地让JavaScript智能感知正确地工作在像这样定义'类'原型的情况下:

function GetCustomerList()
{
}

GetCustomerList.prototype = 
{
    HEADER: {
        RETURN_CODE: 0,
        RETURN_MESSAGE: "",
        }
    ,
    NUM_RECORDS: 0,
    START_RECORD: 0,
    END_RECORD: 0
};

我可以输入一些类似这样的内容:
var req = new GetCustomerList();
req.HEADER.RETURN_CODE = 100;

Visual Studio的智能感知知道HEADER属性,以及自己的属性名为'RETURN_CODE'和'RETURN_MESSAGE'。我可以这样做:

req.NUM_RECORDS = 50;

拥有完美的 IntelliSense。

所以 IntelliSense 可以与复杂嵌套类型一起使用 - 很棒。但是,是否可以在复杂类型的数组中获得 IntelliSense 呢?

例如:

function Customer()

Customer.prototype = {

    NAME: "",
    ADDRESS: "",
    ID: 0
};

function GetCustomerList()
{
}

GetCustomerList.prototype = 
{
    HEADER: {
        RETURN_CODE: 0,
        RETURN_MESSAGE: "",
        }
    ,
    NUM_RECORDS: 0,
    START_RECORD: 0,
    END_RECORD: 0,
    CUSTOMERS: [ new CUSTOMER() ]
};

我有一个“CUSTOMER”类型的数组,我还为它定义了原型。我想这样输入:

req.CUSTOMER[ 0 ].NAME 

我能否通过智能感知让“NAME”成为该数组可用的属性?
这个可能吗?

编辑问题而不是发布重复内容。 - Guffa
标记重复问题以删除。这个问题有更多的细节,应该保留。请取消标记为“完全重复”。 - Adam
请查看我的更新答案。 - Jose Basilio
3个回答

3

更新:

正如您已经注意到的那样,IntelliSense 可以很好地处理您的复杂类型,但却不能在数组中运行。即使您创建了一个由内置类型(如 String)组成的数组,它仍然无法工作。

我对这个问题进行了深入研究,从理论上讲,这应该是可能的,但事实并非如此。
作为测试,请创建一个名为"customers.js"的 javascript 文件并包含以下内容:

function Customer() {
    /// <summary>This is my custom intellisense for the Customer type</summary>
    ///<field name="NAME" type="String">The Customer's name</field>
    ///<field name="ADDRESS" type="String">The customer's address</field>
    ///<field name="ID" type="String">The ID number</field>
}
Customer.prototype = {
    NAME: "",
    ADDRESS: "",
    ID: 0
};

function CustomerList() {
    /// <summary>The List of Customers</summary>
    ///<field name="HEADER" type="String">The header</field>
    ///<field name="CUSTOMERS" type="Array" elementType="Customer" >The list of customers in an Array</field>
}

CustomerList.prototype =
{
    HEADER: {
        RETURN_CODE: 0,
        RETURN_MESSAGE: ""
    },
    NUM_RECORDS: 0,
    START_RECORD: 0,
    END_RECORD: 0,
    CUSTOMERS: [new Customer()]
};

然后在<script src="customers.js"/>中引用此文件。

或者在另一个JS文件中使用/// <reference path="customer.js" />引用。

看看智能感知如何正确显示摘要,但到数组时没有任何内容。

var custList = new CustomerList();

custList.CUSTOMERS // intellisense
custList.CUSTOMERS[0] // no intellisense as you already know

实际上,与那篇帖子完全不同。那篇文章涉及如何在VS配置中让Intellisense正常工作。而这篇文章则是解释如何使用正确的语法来充分利用Intellisense的功能。 - Adam

0

虽然VS不支持它,但您可能想考虑以下解决方法。

我将示例脚本更改为:

function Customer(obj) {
    /// <summary>This is my custom intellisense for the Customer type</summary> 
    ///<field name="NAME" type="String">The Customer's name</field> 
    ///<field name="ADDRESS" type="String">The customer's address</field>
    ///<field name="ID" type="String">The ID number</field>
    if (obj) return obj;
}

Customer.prototype = {
    NAME: '',
    ADDRESS: '',
    ID: 0
};

function CustomerList() {
    /// <summary>The List of Customers</summary> 
    ///<field name="HEADER" type="String">The header</field> 
    ///<field name="CUSTOMERS" type="Array" elementType="Customer" >The list of customers in an Array</field> 
}

CustomerList.prototype =
{
    HEADER: {
        RETURN_CODE: 0,
        RETURN_MESSAGE: ''
    },
    CUSTOMERS: []
}; 

(注意构造函数的更改-不确定智能感知的XML注释)。

然后您可以像这样引用它(带有智能感知):

var list = new CustomerList();

var cust = new Customer();
cust.NAME = 'john';
list.CUSTOMERS.push(cust);

var cust1 = new Customer(list.CUSTOMERS[0]);
alert(cust1.NAME);

var cust2 = new Customer({ NAME: 'Mark' });
alert(cust2.NAME);

反对这种做法的理由是你需要在构造函数中传递参数。

如果VS不支持它,这会解决问题吗?(我没有投反对票,只是在问) - WEFX

0

在VS2008中无法使其工作。它将在下一个版本的VS中工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接