代码之家  ›  专栏  ›  技术社区  ›  Adam

如何让vs 2008 javascript intellisense为复杂原型工作?

  •  3
  • Adam  · 技术社区  · 16 年前

    我已经能够让javascript intellisense为这样定义的“类”原型正常工作:

    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的IntelliSense知道Header属性及其自己的名为“返回代码”和“返回消息”的属性。我能做到:

    req.NUM_RECORDS = 50;
    

    智能感知功能完美运行。

    所以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() ]
    };
    

    其中我有一个“客户”类型的数组,我还为它定义了一个原型。我希望能够输入以下内容:

    req.CUSTOMER[ 0 ].NAME 
    

    并让IntelliSense提示我“name”是此数组可用的属性。

    这有可能吗?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Jose Basilio    16 年前

    更新:

    正如您已经注意到的,IntelliSense对您的复杂类型很好,但在数组中不起作用。即使您创建了一个像字符串这样的内部类型数组,它仍然不能工作。

    我已经彻底研究过这个话题,理论上,这是可能的,但事实并非如此。
    作为测试,创建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"/>

    /// <reference path="customer.js" /> 在另一个JS文件中。

    看看intellisense如何正确地显示摘要,但是当涉及到数组时,什么都没有。

    var custList = new CustomerList();
    
    custList.CUSTOMERS // intellisense
    custList.CUSTOMERS[0] // no intellisense as you already know
    
        2
  •  0
  •   Alan Oursland    16 年前

    在VS2008中没有办法让它工作。它将在下一个版本的vs.

        3
  •  0
  •   Dawid    14 年前

    虽然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: []
    }; 
    

    (注意构造函数中的更改-不确定IntelliSense的XML注释)。

    然后您可以这样引用它(使用intellisense):

    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);
    

    与此相反的参数是您需要构造函数中的参数。