• javascript操作符之new 也疯狂 (2)


    JavaScript本是一种基于原形的(prototypal)语言,但它的“new”操作符看起来有点像经典语言。这迷惑了广大程序员们,并导致了很多使用上的问题。

    在JavaScript中,不要用到new Object()这种操作,该用{ }来代替。同理,也不要用new Array(),相应的,用[]来代替。JavaScript的Array绝不同于Java的Array,模仿Java的语法只会使人越来越糊涂。

    也不要用new Number,new String,或是new Boolean。在JavaScript使用包装对象完全没有必要,只需使用普通的声明就可以了。

    不要用new Function来新建一个function,而应当用最普通的function表达式。例如:

    frames[0].onfocus = new Function(”document.bgColor=’antiquewhite’”)

    更好的写法是:

    frames[0].onfocus = function () {document.bgColor = ‘antiquewhite’;};

    同样定义一个事件,第二句不会立即检测函数体,哪怕是函数体有错,也不会立即报错。只有不了解function内部机制的人才会用new Function这种声明方式。

    selObj.onchange = new Function(”dynamicOptionListObjects["

    dol.index "].change(this)”);

    如果我们直接写出函数体,编译器是无法看到其内部的(也就无法立即执行、无法立即引发错误)。但如果我们用表达式方式声明函数(如上),看不到函数内部的则是我们。编程的话,还是尽量对一且都尽量清晰可见吧。以声明函数的方式来返回一个函数,我们可以更加明确地传值,如下代码,它还可以设定一个初始值。

    selObj.onchange = function (i) {

    return function () {

    dynamicOptionListObjects.change(this);

    };
    }(dol.index);

    还有一个不好的习惯是将new放到function的前面,比如,new function对于构造新的对象来说,毫无意义。

    myObj = new function () {

    this.type = ‘core’;
    };
    最好使用一个对象,更轻盈,更快捷,如下:

    myObj = {

    type: ‘core’
    };

    如你希望新建一个既有私有变量,也有私有方法的函数对象,也不要使用new操作符。

    var foo = new function() {

    function processMessages(message) {

    alert(”Message: ” message.content);

    }

    this.init = function() {

    subscribe(”/mytopic”, this, processMessages);

    }
    }

    如果像上面一样使用new来执行此方法,这个对象会挂在一个没有意义的prototype上,它只会浪费内存。如果我们不用new,就不会浪费prototype对象于prototype链,所以,更佳的方案是使用()。如下所示:

    var foo = function () {

    function processMessages(message) {

    alert(”Message: ” message.content);

    }

    return {

    init: function () {

    subscribe(”/mytopic”, this, processMessages);

    }

    };
    }();

    译后总结:由于以前对yui并不了解直接就用了ext,对js的不少地方也一知半解,直到看了这篇frank所给的文章才对new操作符略知一二。
    给我的感觉就是:尽量不要显示地用new操作符,因为new这个东西在编译期就已经对对象进行初始化了,不用new的话运行期才进行初始化检查。(实际上我的用词不准确,在js中都是编译期,或都是运行期)。这样可以节省内存,且有利于调试,亦便于理解。
    Ext的源码中用到了很多上面所提及的写法,如果以前不很明白,看完篇文章之后会有种豁然开朗的感觉。

    对“prototype链”不太明白的可以参考这篇 http://www.javaeye.com/topic/53537

  • 相关阅读:
    图标字体IcoMoon 使用
    JS 寻找孩子并打印路径
    为什么要用on()而不直接使用click
    setTimeout 虚假的“异步”
    解决Ajax.BeginForm还是刷新页面的问题
    .net生成Excel,并下载
    C#判断文件是否正在被使用
    sql为数字添加千分位(也就是钱的格式)
    HotelIInventory项目小结
    一步一步实现FormsAuthentic验证登录
  • 原文地址:https://www.cnblogs.com/litao229/p/1506932.html
Copyright © 2020-2023  润新知