【JS】javascript 面向对象编程
参考资料:Javascript 面向对象编程
先说一些关于this的
1. 关键词:“动态”、“设置”。
函数中的 this 是动态的,不同条件下使用 this 指向是不同的,当然,也可以使用 call、apply、bind 修改 this
2. 关键词:“媒介”
this 可以视为一种媒介,可以通过它找到各种方法和属性(自有的和继承的)
3. 关键词:“自有和继承”
常见的利用函数创建类时,可以直接在实例上添加属性,也可以让实例继承属性
以下内容基于ECMAScript5.
变量
JavaScript 中,变量定义基本如下:
var name = ‘Yi Yang‘;; var email = ‘yiyang(@)hotmail.com‘; var website = ‘http://coolshell.cn‘;
如果用面向对象的写法,则如下:
var yiyang = { name :‘Yi Yang‘, email : ‘yiyang(@)hotmail.com‘, website : ‘http://coolshell.cn‘ };
于是,就可以这样访问:
//以成员 yiyang.name; yiyang.email; yiyang.website; //以hash map的方式 yiyang["name"]; yiyang["email"]; yiyang["website"];
函数
JavaScript 的函数是这样的:
var doSomething = function(){ alert(‘Hello World.‘); };
于是,可以这样写:
var sayHello = function(){ var hello = "Hello, I‘m "+ this.name + ", my email is: " + this.email + ", my website is: " + this.website; alert(hello); }; //直接赋值,这里很像C/C++的函数指针 yiyang.Hello = sayHello; yiyang.Hello();
还有一种比较规范的写法:
//我们可以看到, 其用function来做class。 var Person = function(name, email, website){ this.name = name; this.email = email; this.website = website; this.sayHello = function(){ var hello = "Hello, I‘m "+ this.name + ", \n" + "my email is: " + this.email + ", \n" + "my website is: " + this.website; alert(hello); }; }; var yiyang = new Person("Yi Yang", "[email protected]", "http://coolshell.cn"); yiyang.sayHello();
配置属性:Object.defineProperty()
例如
//创建对象 var yiyang = Object.create(null); //设置一个属性 Object.defineProperty( yiyang, ‘name‘, { value: ‘Yi Yang‘, writable: true, configurable: true, enumerable: true }); //设置多个属性 Object.defineProperties( yiyang, { ‘email‘ : { value: ‘[email protected]‘, writable: true, configurable: true, enumerable: true }, ‘website‘: { value: ‘http://coolshell.cn‘, writable: true, configurable: true, enumerable: true } } );
get / set 访问器
当访问属性时,会调用get,当设置属性时,会调用set,如下例
var age = 0; Object.defineProperty( yiyang, ‘age‘, { get: function() {return age+1;}, set: function(value) {age = value;} enumerable : true, configurable : true } ); yiyang.age = 100; //调用set alert(yiyang.age); //调用get 输出101(get中+1了);
我们可以通过现有属性来构造新的属性,如利用已有的属性(age)通过 get 和 set 构造新的属性(birth_year)
Object.defineProperty( chenhao, ‘birth_year‘, { get: function() { var d = new Date(); var y = d.getFullYear(); return ( y - this.age ); }, set: function(year) { var d = new Date(); var y = d.getFullYear(); this.age = y - year; } } ); alert(yiyang.birth_year); yiyang.birth_year = 2000; alert(yiyang.age);
我们当然可以这样写
var yiyang = { name: "Yi Yang", email: "[email protected]", website: "http://coolshell.cn", age: 100, get birth_year() { var d = new Date(); var y = d.getFullYear(); return ( y - this.age ); }, set birth_year(year) { var d = new Date(); var y = d.getFullYear(); this.age = y - year; } }; alert(yiyang.birth_year); yiyang.birth_year = 2000; alert(yiyang.age);
相比上面的写法,defineProperty 有以下好处:
1)设置如 writable,configurable,enumerable
等这类的属性配置。
2)动态地为一个对象加属性。比如:一些HTML的DOM对像。
还有继承、重载,未完待续。。。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。