您的当前位置:首页正文

关于js的几个特点

2024-11-25 来源:个人技术集锦

var baz;
(function() {
var foo = 10;
var bar = 2;
baz= function() {
return foo*bar;
}
})();
baz();本文为学习《Javascript设计模式》一书后总结而来

代码格式的灵活性

怎么个灵活法?就是我们如果想要实现一个功能,可以通过各种不同的方式来实现。比如,现在,我想要实现开始某些动作(startOperation),和结束某些动作(endOperation)的功能.

过程式程序设计

   	 function startOperation() {
            ...
        }

        function endOperation() {
            ...
        }

将方法封装在一个类中

  

   var Operation= function() {
            ...
        }

        Operation.prototype.startOperation=function() {
            ...
        }

        Operation.prototype.endOperation=function() {
            ...
        }
        //调用函数
        var mOperation = new Operation();
        mOperation.mOperation();
        ...
        mOperation.endOperation();


方法声明嵌入类的声明中

 

 var Operation= function() {
            ...
        }

        Operation.prototype = {
            startOperation: function() {
                ...
            },
            startOperation: function() {
                ...
            }

        };


通过prototype.method为类添加函数

        Function.prototype.method = function(name, fn) {
            this.prototype[name] = fn;
        };
        var Operation= function() {
            ...
        }
        Operation.method('startOperation', function() {
            ...
        });
        Operation.method('endOperation', function() {
            ...
        });

改进prototype.method方法

        Function.prototype.method = function(name, fn) {
            this.prototype[name] = fn;
            return this;
        };
        var Operation= function() {
            ...
        }
        Operation.method('startOperation', function() {
            ...
        }).
        method('endOperation', function() {
            ...
        });

函数是一等对象

我们在这里,只说对该特色的应用。

使用匿名函数(闭包)保护变量,创建类的私有变量

这种保护,是建立在js的以下两点来实现的:

  • 函数作用域内的局部变量不能被外界访问
  • 函数在被调用时,是在其定义作用域内运行,而非在调用函数的作用域内运行。

比如以下代码:

 var baz;
        (function() {
            var foo = 10;
            var bar = 2;
            baz= function() {
                return foo*bar;
            }
        })();
        baz();


由于函数定义在闭包中,即使在闭包执行结束,baz仍能访问foo/bar这两个变量

对象易变性

除了可以随便在对象定以后,继续向对象中添加属性,在这里再说一下顺序问题。看下面这个代码:

       function Person(name, age) {
            this.name=name;
            this.age=age;
        }
        Person.prototype= {
            getName: function() {
                return this.name;
            },
            getAge: function() {
                return this.age;
            }
        }
        var alice = new Person('Alice', 93);
        var bill = new Person('Bill', 30);
        Person.prototype.getGreeting = function() {
            return 'Hi' + this.getName() + '!';
        };
虽然我们对Person对象中函数的添加时在alice和bill实例化之后,但alice和bill仍然具有我们在之后添加的这个函数。


显示全文