js继承4:三种对象声明方式 Posted on 2015-04-01 | In js入门 | 这两天比较仔细的研究了一下js的继承 发现之前自己写的那个太粗糙了…这篇说下构造对象的几种方法, 下篇说说最终的选型 一: 字面量声明12345678910111213141516171819// 因为是直接={}, 相当于直接new Object(); 所以没有function作用域, 不许用return和this.X// 只声明一个对象时适用var user0 = { name: "user0", age: 0, getName: function() { return this.name; } // 不能: // return // this.name = "user111"}var user1 = new Object({ name: "user1", age: 1, getName: function() { return this.name; }}); 二: function定义(无return), new构造12345678910111213141516171819202122232425262728293031323334353637383940// function有自己作用域, 可以this和return function User2(age) { //1 非静态 //1.1: private属性 var private_age = 12; private_age_NO_VAR = 100;//没有var也一样 // private方法 var private_IsChild = function(_age) { return _age < 18; }; function private_NoUse(a) {}; //其实和private_IsChild等价 //1.2: 对象内public属性 this.public_Name = "user(对象).name"; this.public_age = age; //public方法, 通过这暴露private方法 this.public_isChild = private_IsChild(this.public_age );//参数里私有属性不能加"this":private_age } //2 静态属性 User2.public_static_Name = "User2.name"; User2.public_static_Fun = function(){ console.log("静态方法public_static_Fun2"); }; //3 原型属性 User2.prototype = { ptt_Name: "User2.prototype.name", ptt_getPptName: function() { console.log("类原型方法"); console.log("对象private属性" + this.private_age); console.log("对象public属性" + this.public_age); } }; var user2 = new User2(20); console.group("2:function方法定义, new构造对象"); console.log(user2.private_IsChild); //undefined private属性访问不到 console.log("2.1_"+user2.public_isChild); //public属性可访问到 console.log(User2.public_static_Name); console.log(user2.ptt_Name); console.groupEnd(); 三:带return的情况123456789101112131415161718192021222324252627282930313233343536373839404142434445464748// function中return的都是public对象, 否则都是private // return中对象从新绑定this // 最重要的是原型会失效... function User3(age) { //1 非静态 //1.1: private属性 var private_age = 12; this.public_age = age; var fun = function(param){ //这里访问不到this.public_age, 但可以访问到this.public_age_2 //因为this换到return的新对象里 return param - private_age - this.public_age_2; } //1.2: public属性 //有return以后, 所有非return的都变成私有属性. //并且this更换到return的对象里 return { public_age_1 : private_age, public_age_2 : this.public_age, fun : fun } } //2 静态属性 User3.public_static_Name = "User3.public_static_Name"; User3.public_static_Fun = function(){ console.log("静态方法public_static_Fun"); }; //3 原型属性 User3.prototype = { ptt_Name: "User3.prototype.name", ptt_getPptName: function() { console.log("类原型方法"); console.log("对象private属性" + this.private_age); console.log("对象public属性" + this.public_age_1); } } var user3 = new User3(20); console.group("3:function方法定义(带return), new构造对象"); console.log(user3.private_age); console.log(user3.public_age); //非return的属性都访问不到了 console.log(user3.public_age_1);//仅return的是public console.log(User3.public_static_Name); console.log(user3.ptt_Name); //原型失效 console.groupEnd();