javascript进阶——面向对象特性
面向对象的javascript是这门语言被设计出来时就考虑的问题,熟悉OOP编程的概念后,学习不同的语言都会发现不同语言的实现是不同的,javascript的面向对象特性与其他具有面向对象特性的语言的实现的区别比较大,通过不断编程实践才能逐渐体会到面向对象的优点从而形成自己独特的javascript面向对象实现方式,这也是编写可重用代码的关键。
一、语言特性
1、引用
- var obj = new Object();
- var objRef = obj;
- obj.oneProperty = 1;
- alert(obj.oneProperty == objRef.oneProperty);//显示true
- var items = new Array("1","2","3");
- var itemsRef = items;
- items.push("4");
- alert(items.length == itemsRef.length);//结果是true,因为Array对象将数组元素作为其属性对象保存
- items = new Array("one","two","three");
- alert(items != itemsRef); //结果true,已经是两个不同的对象了
2、函数重载和类型检查
- 使用typeof操作符:返回一个字符串名称,表示变量内容的类型,当返回object时,自定义对象都是返回object,因此很难与其他对象区分。
- 构造函数constructor属性:引用的是原来用来构造该对象的那个函数名。
- function delayAlert(msg,time){
- setTimeout(function(){
- alert(msg);
- }, time);
- }
- delayAlert("welcome", 2000);//调用代码清晰简洁
- function add(num){
- return function(toAdd){return num + toAdd};
- }
- var addFive = add(5);
- alert(add(4) == 9); //结果true,闭包实现函数的Curry化
- var obj = document.getElementById("main");
- var items = ["click", "keypress"];
- for(var i = 0; i < items.length; i++){
- (function(){
- var item = items[i];
- obj["on" + item] = function(){alert(item);};
- })();
- }
- //使用匿名函数激发出作用域,for循环中获得当前循环时的i值
4、上下文对象
- function changeColor(color){
- this.style.color = color;
- }
- changeColor.call(document.getElementById("main"), "black");
二、面向对象编程
1、对象及方法
- 使用new Object(),再单独添加属性和方法
- 使用{......}键值对创建
- 使用构造函数创建,任何函数都可以被实例化为一个对象。
- function User(properties){
- for( var i in properties){ (function(which){
- var p = i;
- which["get" + p] = function(){return properties[p];};
- which["set" + p] = function(){properties[p] = val;};
- })(this);)
- }
- }
- //特权方法实例
- var user = new User({name:"Bob",age:44});
- alert(user.name == null); //没有name属性
- alert(user.getname() == "Bob");//动态获取属性
- user.setage(22);
- alert(user.getage() == 22);//动态获取
2、继承
- 原型式继承:对象的构造函数可以从其他对象中继承方法,它创建出一个原型对象后,所有其他的新对象都可以基于这个原型对象来构建。
- function Person(name){this.name = name;};
- Person.prototype.getName = function(){return this.name;};
- function User(name, password){this.name = name;
- this.password = password;};
- User.prototype = new Person();
- User.prototype.getPassword = function(){return this.password;};
- 类式继承:带有方法的类就可以实例化为对象。
- //继承自单一函数。将新函数绑定到对象的prototype上
- Function.prototype.method = function(name, func){
- this.prototype[name] = func;
- return this;
- };
- Function.method(‘inherits‘, function(parent){var this.prototype = new parent(); return this;});
- //从单一父对象继承所有内容
- Function.method(‘swiss‘, function(parent){
- for (var i = 1; i < arguments.length; i++){
- var name = arguments[i];
- this.prototype[name] = parent.prototype[name];
- }
- return this;
- });
- function Person(name){this.name = name;};
- Person.method("getName", function(){}return name;);
- function User( name, password){
- this.name = name;
- this.password = password;
- };
- User.inherits( Person);
- User.method(‘getPassword‘, function(){return this.password;});
- User.method(‘getName‘, function(){return this.name;});
3、继承库
- Base库,可以写出可读、有用好理解的面向对象javascript代码。
- Prototype库,一个为了配合Ruby on Rails的web开发框架配合设计的javascript库,给核心javascript对象添加了一大堆的函数和属性。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。