none
为啥对静态方法类使用new会得到不正确的结果? RRS feed

  • 问题

  • 用微软最新的TypeScript写了如下的代码片段:

    module MySample {
     
        export interface IComparable {
            Compare(object1:any,object2:any): number;
        }
     
        export class MyComparer implements IComparable {
            Compare(object1: any, object2: any): number {
                if (typeof (object1) == "number" && typeof(object2)=="number") {
                    var n: number = object1 - object2;
                    return n;
                }
                else if (typeof (object1) == "string" && typeof(object2)=="string") {
                    return object1 > object2 ? 1 : (object1 == object2) ? 0 : -1;
                }
                throw Error("Cannot compare a different kind of type together!");
            }
        }
     
        export class GeneralComparer {
            static Comparer(num1:any,num2:any,comparer: IComparable): number {
                return comparer.Compare(num1, num2);
            }
        }
    }

    编译成功,在一个普通的Html中调用:

    <!DOCTYPE html>
     
    <html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>TypeScript HTML App</title>
        <link rel="stylesheet" href="app.css" type="text/css" />
        <script src="app.js"></script>
        <script>
            function Ini()
            {
                var result = new MySample.GeneralComparer.Comparer(1, 2, new MySample.MyComparer());
                alert(result);
                
            }
        </script>
    </head>
    <body onload="Ini()">
        <h1>TypeScript HTML App</h1>
     
        <div id="content">
            
        </div>
    </body>
    </html>

    结果是[Object,object]。

    我后来检查了问题,在于这句:

    new MySample.GeneralComparer.Comparer

    去掉“new”就可以了(因为是静态方法)。

    现在问题在于为什么加了new调用就不可以了呢?附上编译自动生成的js代码:

    var MySample;
    (function (MySample) {
        var MyComparer = (function () {
            function MyComparer() {
            }
            MyComparer.prototype.Compare = function (object1, object2) {
                if (typeof (object1) == "number" && typeof (object2) == "number") {
                    var n = object1 - object2;
                    return n;
                } else if (typeof (object1) == "string" && typeof (object2) == "string") {
                    return object1 > object2 ? 1 : (object1 == object2) ? 0 : -1;
                }
                throw Error("Cannot compare a different kind of type together!");
            };
            return MyComparer;
        })();
        MySample.MyComparer = MyComparer;
     
        var GeneralComparer = (function () {
            function GeneralComparer() {
            }
            GeneralComparer.Comparer = function (num1, num2, comparer) {
                return comparer.Compare(num1, num2);
            };
            GeneralComparer.Show = function () {
                return 1;
            };
            return GeneralComparer;
        })();
        MySample.GeneralComparer = GeneralComparer;
    })(MySample || (MySample = {}));
    //# sourceMappingURL=app.js.map

    ASP.NET Questions
    Other Discussions
    FreeRice Donate
    Issues to report
    Free Tech Books Search



    2014年1月8日 6:04

答案

  • 感谢你的信任,这部分代码我已经重现了,我很清楚你说的问题。

    〉TypeScript貌似没有静态类的概念吧……

    是的,TypeScript没有静态类(即 没有Static声明的类),但是关键字Static定义的方法,该静态方法会被该类直接引用(换句话说就是隐性地被转换为静态的类)。

    你能看看这个链接,了解更多的信息:

    Static Method in TypeScript

    http://www.c-sharpcorner.com/UploadFile/c63ec5/static-method-in-typescript3/


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place. <br/> Click <a href="http://support.microsoft.com/common/survey.aspx?showpage=1&scid=sw%3Ben%3B3559&theme=tech"> HERE</a> to participate the survey.


    2014年1月10日 2:51
    版主

全部回复

  • 你好,

        我添加一个新的test  class ,并且创建了Comparerd()方法, 像下面这样:

    export class GeneralComparer { static Comparer(num1: any, num2: any, comparer: IComparable): number { return comparer.Compare(num1, num2); } } export class test { Comparerd():string { return "sdsds "; } static ComparerSta(): string { return "sdsds static"; }

    }

      添加这样的脚本:

     <script>
            function Ini() {
              //use static method
                var result = MySample.GeneralComparer.Comparer(1, 2, new MySample.MyComparer());
                alert(result);
    
                //with static method
                var teststa = (MySample.test).ComparerSta();
                alert(teststa);
    
                //without static method
                  var testvalue =(new  MySample.test).Comparerd();
                  alert(testvalue);
    
            }
        </script>

    我发现如果使用静态方法,它会要求 test类是静态的, 使用Oject.Method 方式调用;

    如果使用非静态方法,它会要求 test类是非静态的, 使用(new Oject).Method 方式调用,需要实例化当前类;

    同时你在Visual Studio的智能提示中可以发现, 当你使用静态方法,而你通过实例化当前类去调用 你是无法找到当前Method.

    希望可以帮助你,如果你需要更多协助请让我们知道。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place. <br/> Click <a href="http://support.microsoft.com/common/survey.aspx?showpage=1&scid=sw%3Ben%3B3559&theme=tech"> HERE</a> to participate the survey.

    2014年1月9日 5:37
    版主
  • 感谢您的回复。

    >如果使用静态方法,它会要求 test类是静态的, 使用Oject.Method 方式调用

    TypeScript貌似没有静态类的概念吧……

    你可以留下Email以便于我直接打包发送示例代码给你运行看看嘛?谢谢了。


    ASP.NET Questions
    Other Discussions
    FreeRice Donate
    Issues to report
    Free Tech Books Search

    2014年1月10日 1:00
  • 感谢你的信任,这部分代码我已经重现了,我很清楚你说的问题。

    〉TypeScript貌似没有静态类的概念吧……

    是的,TypeScript没有静态类(即 没有Static声明的类),但是关键字Static定义的方法,该静态方法会被该类直接引用(换句话说就是隐性地被转换为静态的类)。

    你能看看这个链接,了解更多的信息:

    Static Method in TypeScript

    http://www.c-sharpcorner.com/UploadFile/c63ec5/static-method-in-typescript3/


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place. <br/> Click <a href="http://support.microsoft.com/common/survey.aspx?showpage=1&scid=sw%3Ben%3B3559&theme=tech"> HERE</a> to participate the survey.


    2014年1月10日 2:51
    版主