javascript——面向对象程序设计,1

  1     <script type="text/javascript">
  2         //ECMA-262把对象定义为:“无序属性的 集合,其属性可以包含基本值、对象或者函数”
  3         //理解对象,最简单的方式就是通过创建一个Object的实例,然后为它添加属性和方法
  4         var person = new Object();
  5         person.name = "Xulei";
  6         person.age = "23";
  7         person.job = "前端工程师";
  8         person.sayName = function () {
  9             alert(this.name);
 10         }
 11 
 12         //还可以这样写
 13         var person = {
 14             name: "xulei",
 15             age: 23,
 16             job: "前端工程",
 17             sayName: function () {
 18                 alert(this.name)
 19             }
 20         }
 21 
 22 
 23         //一、属性类型:数据属性和访问其属性
 24         //1、数据属性,有4个描述其行为的特性
 25         //[Configurable]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认值为true
 26         //[Enumerable]:表示能否通过for-in返回属性,默认值为true
 27         //[Writable]:表示能否修改属性,默认值为true
 28         //[Value]:包含这个属性的数据值。默认值为undefined
 29         var person = {
 30             name: "xulei"
 31         }
 32         //这里创建了一个person对象,value值就是“xulei”
 33 
 34         //要修改属性的默认特性,必须使用ECMAScript5的Object.defineProperty(属性所在的对象,属性的名字,描述符对象)
 35         //描述符对象必须是configurable、enumerable、writable、value
 36         var peron = {}
 37         Object.defineProperty(peron, "name", {
 38             writable: false,//属性不能被修改
 39             value: "徐磊-xulei"
 40         });
 41 
 42         alert(peron.name);//徐磊-xulei
 43         peron.name = "徐磊";
 44         alert(peron.name);//徐磊-xulei
 45         //以上操作在非严格模式下赋值操作会被忽略,如果在严格模式下会抛出异常
 46         //一旦把属性定义为不可配置的就不能把它变回可配置的了。
 47         //在多数情况下都没有必要利用Object.defineProperty()方法提供的这些高级功能。但是对理解javascript非常有用。
 48         //建议读者不要在ie8上使用此方法。
 49 
 50 
 51         //2、访问其属性,有4个特性
 52         //[Configurable]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认值为true
 53         //[Enumerable]:表示能否通过for-in返回属性,默认值为true
 54         //[Get]:在读取时调用的函数 默认值undefined
 55         //[Set]:在写入属性时调用的函数 默认值Undefined
 56         var book={
 57             _year:2004,
 58             edition:1
 59         }
 60 
 61         Object.defineProperty(book,"year",{
 62             get:function(){
 63                 return this._year;
 64             },
 65             set:function(value){
 66                 if(value>2004){
 67                     this._year=value;
 68                     this.edition +=value-2004;
 69                 }
 70             }
 71         });
 72         book.year=2005;
 73         alert(book.edition);//2
 74 
 75 
 76 
 77 
 78 
 79         //创建对象
 80         //1、将构造函数当做函数
 81         function Person(name,age,job) {
 82             this.name=name;
 83             this.age=age;
 84             this.job=job;
 85             this.sayName=function(){
 86                 alert(this.name);
 87             }
 88         }
 89 
 90         //当做构造函数使用
 91         var person=new Person("xulei",23,"software");
 92         person.sayName();
 93 
 94         //作为普通函数使用
 95         Person("xulei2",23,"job2");//添加到window中
 96         window.sayName();
 97 
 98         //在另一个对象的作用域中调用
 99         var o=new Object();
100         Person.call(o,"xulei3",23,"job3");
101         o.sayName();
102     </script>