锁定老帖子 主题:[转]悟透JavaScript 二
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-06-02
构造对象 function MyFunc() {}; //定义一个空函数
var anObj = new MyFunc(); //使用new操作符,借助MyFun函数,就创建了一个对象
function MyFunc(){};
var anObj = {}; //创建一个对象 MyFunc.call(anObj); //将anObj对象作为this指针调用MyFunc函数
1 function Person(name) //带参数的构造函数
2 { 3 this.name = name; //将参数值赋给给this对象的属性 4 this.SayHello = function() {alert("Hello, I'm " + this.name);}; //给this对象定义一个SayHello方法。 5 }; 6 7 function Employee(name, salary) //子构造函数 8 { 9 Person.call(this, name); //将this传给父构造函数 10 this.salary = salary; //设置一个this的salary属性 11 this.ShowMeTheMoney = function() {alert(this.name + " $" + this.salary);}; //添加ShowMeTheMoney方法。 12 }; 13 14 var BillGates = new Person("Bill Gates"); //用Person构造函数创建BillGates对象 15 var SteveJobs = new Employee("Steve Jobs", 1234); //用Empolyee构造函数创建SteveJobs对象 16 17 BillGates.SayHello(); //显示:I'm Bill Gates 18 SteveJobs.SayHello(); //显示:I'm Steve Jobs 19 SteveJobs.ShowMeTheMoney(); //显示:Steve Jobs $1234 20 21 alert(BillGates.constructor == Person); //显示:true 22 alert(SteveJobs.constructor == Employee); //显示:true 23 24 alert(BillGates.SayHello == SteveJobs.SayHello); //显示:false
function SayHello() //先定义一份SayHello函数代码
{ alert("Hello, I'm " + this.name); }; function Person(name) //带参数的构造函数 { this.name = name; //将参数值赋给给this对象的属性 this.SayHello = SayHello; //给this对象SayHello方法赋值为前面那份SayHello代码。 }; var BillGates = new Person("Bill Gates"); //创建BillGates对象 var SteveJobs = new Person("Steve Jobs"); //创建SteveJobs对象 alert(BillGates.SayHello == SteveJobs.SayHello); //显示:true
function Person(name)
{ this.name = name; //设置对象属性,每个对象各自一份属性数据 }; Person.prototype.SayHello = function() //给Person函数的prototype添加SayHello方法。 { alert("Hello, I'm " + this.name); } var BillGates = new Person("Bill Gates"); //创建BillGates对象 var SteveJobs = new Person("Steve Jobs"); //创建SteveJobs对象 BillGates.SayHello(); //通过BillGates对象直接调用到SayHello方法 SteveJobs.SayHello(); //通过SteveJobs对象直接调用到SayHello方法 alert(BillGates.SayHello == SteveJobs.SayHello); //因为两个对象是共享prototype的SayHello,所以显示:true
1 function Person(name) //基类构造函数
2 { 3 this.name = name; 4 }; 5 6 Person.prototype.SayHello = function() //给基类构造函数的prototype添加方法 7 { 8 alert("Hello, I'm " + this.name); 9 }; 10 11 function Employee(name, salary) //子类构造函数 12 { 13 Person.call(this, name); //调用基类构造函数 14 this.salary = salary; 15 }; 16 17 Employee.prototype = new Person(); //建一个基类的对象作为子类原型的原型,这里很有意思 18 19 Employee.prototype.ShowMeTheMoney = function() //给子类添构造函数的prototype添加方法 20 { 21 alert(this.name + " $" + this.salary); 22 }; 23 24 var BillGates = new Person("Bill Gates"); //创建基类Person的BillGates对象 25 var SteveJobs = new Employee("Steve Jobs", 1234); //创建子类Employee的SteveJobs对象 26 27 BillGates.SayHello(); //通过对象直接调用到prototype的方法 28 SteveJobs.SayHello(); //通过子类对象直接调用基类prototype的方法,关注! 29 SteveJobs.ShowMeTheMoney(); //通过子类对象直接调用子类prototype的方法 30 31 alert(BillGates.SayHello == SteveJobs.SayHello); //显示:true,表明prototype的方法是共享的
function Person(name)
{ this.name = name; }; Person.prototype.company = "Microsoft"; //原型的属性 Person.prototype.SayHello = function() //原型的方法 { alert("Hello, I'm " + this.name + " of " + this.company); }; var BillGates = new Person("Bill Gates"); BillGates.SayHello(); //由于继承了原型的东西,规规矩矩输出:Hello, I'm Bill Gates var SteveJobs = new Person("Steve Jobs"); SteveJobs.company = "Apple"; //设置自己的company属性,掩盖了原型的company属性 SteveJobs.SayHello = function() //实现了自己的SayHello方法,掩盖了原型的SayHello方法 { alert("Hi, " + this.name + " like " + this.company + ", ha ha ha "); }; SteveJobs.SayHello(); //都是自己覆盖的属性和方法,输出:Hi, Steve Jobs like Apple, ha ha ha BillGates.SayHello(); //SteveJobs的覆盖没有影响原型对象,BillGates还是按老样子输出
function Person(name)
{ this.name = name; }; Person.prototype.SayHello = function() //建立对象前定义的方法 { alert("Hello, I'm " + this.name); }; var BillGates = new Person("Bill Gates"); //建立对象 BillGates.SayHello(); Person.prototype.Retire = function() //建立对象后再动态扩展原型的方法 { alert("Poor " + this.name + ", bye bye!"); }; BillGates.Retire(); //动态扩展的方法即可被先前建立的对象立即调用
String.prototype.trim = function String$trim() {
if (arguments.length !== 0) throw Error.parameterCount(); return this.replace(/^\s+|\s+$/g, ''); }
function Person(firstName, lastName, age)
{ //私有变量: var _firstName = firstName; var _lastName = lastName; //公共变量: this.age = age; //方法: this.getName = function() { return(firstName + " " + lastName); }; this.SayHello = function() { alert("Hello, I'm " + firstName + " " + lastName); }; }; var BillGates = new Person("Bill", "Gates", 53); var SteveJobs = new Person("Steve", "Jobs", 53); BillGates.SayHello(); SteveJobs.SayHello(); alert(BillGates.getName() + " " + BillGates.age); alert(BillGates.firstName); //这里不能访问到私有变量
//定义构造函数
function Person(name) { this.name = name; //在构造函数中定义成员 }; //方法定义到构造函数的prototype上 Person.prototype.SayHello = function() { alert("Hello, I'm " + this.name); }; //子类构造函数 function Employee(name, salary) { Person.call(this, name); //调用上层构造函数 this.salary = salary; //扩展的成员 }; //子类构造函数首先需要用上层构造函数来建立prototype对象,实现继承的概念 Employee.prototype = new Person() //只需要其prototype的方法,此对象的成员没有任何意义! //子类方法也定义到构造函数之上 Employee.prototype.ShowMeTheMoney = function() { alert(this.name + " $" + this.salary); }; var BillGates = new Person("Bill Gates"); BillGates.SayHello(); var SteveJobs = new Employee("Steve Jobs", 1234); SteveJobs.SayHello(); SteveJobs.ShowMeTheMoney(); 原型类模型虽然不能模拟真正的私有变量,而且也要分两部分来定义类,显得不怎么“优雅”。不过,对象间的方法是共享的,不会遇到垃圾回收问题,而且性能优于“闭包”模型。正所谓“有失必有得”嘛。 在原型模型中,为了实现类继承,必须首先将子类构造函数的prototype设置为一个父类的对象实例。创建这个父类对象实例的目的就是为了构成原型链,以起到共享上层原型方法作用。但创建这个实例对象时,上层构造函数也会给它设置对象成员,这些对象成员对于继承来说是没有意义的。虽然,我们也没有给构造函数传递参数,但确实创建了若干没有用的成员,尽管其值是undefined,这也是一种浪费啊。 作者: 李站 原址: http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 1336 次