javascript对象的创建和继承实现

本文介绍了JavaScript中五种创建对象的方法:基于已有对象、工厂方式、构造函数方式、原型方式及动态原型方式,并详细探讨了五种实现对象继承的技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript对象的创建

JavaScript中定义对象的几种方式(JavaScript中没有类的概念,只有对象):

1) 基于已有对象扩充其属性和方法:

[html] view plain copy print?

  1. var object = new Object;
  2. object.name = "zhangsan";
  3. object.sayName = function(name)
  4. {
  5. this.name = name;
  6. alert(this.name);
  7. }
  8. object.sayName("lisi");

2)工厂方式

[html] view plain copy print?

  1. //工厂方式创建对象
  2. /*
  3. function createObject
  4. {
  5. var object = new Object;
  6. object.username = "zhangsan";
  7. object.password = "123";
  8. object.get = function
  9. {
  10. alert(this.username + ", " + this.password);
  11. }
  12. return object;
  13. }
  14. var object1 = createObject;
  15. var object2 = createObject;
  16. object1.get;

带参数的构造方法:

[html] view plain copy print?

  1. function createObject(username, password)
  2. {
  3. var object = new Object;
  4. object.username = username;
  5. object.password = password;
  6. object.get = function
  7. {
  8. alert(this.username + ", " + this.password);
  9. }
  10. return object;
  11. }
  12. var object1 = createObject("zhangsan", "123");
  13. object1.get;

让一个函数对象被多个对象所共享,而不是每一个对象拥有一个函数对象。

[html] view plain copy print?

  1. function get
  2. {
  3. alert(this.username + ", " + this.password);
  4. }
  5. function createObject(username, password)
  6. {
  7. var object = new Object;
  8. object.username = username;
  9. object.password = password;
  10. object.get = get;
  11. return object;
  12. }
  13. var object = createObject("zhangsan", "123");
  14. var object2 = createObject("lisi", "456");
  15. object.get;
  16. object2.get;

3)构造函数方式

[html] view plain copy print?

  1. function Person
  2. {
  3. //在执行第一行代码前,js引擎会为我们生成一个对象
  4. this.username = "zhangsan";
  5. this.password = "123";
  6. this.getInfo = function
  7. {
  8. alert(this.username + ", " + this.password);
  9. }
  10. //此处有一个隐藏的return语句,用于将之前生成的对象返回
  11. }
  12. var person = new Person;
  13. person.getInfo;

可以在构造对象时传递参数

[html] view plain copy print?

  1. function Person(username, password)
  2. {
  3. this.username = username;
  4. this.password = password;
  5. this.getInfo = function
  6. {
  7. alert(this.username + ", " + this.password);
  8. }
  9. }
  10. var person = new Person("zhangsan", "123");
  11. person.getInfo;

4)原型(“prototype”)方式

[html] view plain copy print?

  1. //使用原型(prototype)方式创建对象
  2. /*
  3. function Person
  4. {
  5. }
  6. Person.prototype.username = "zhangsan";
  7. Person.prototype.password = "123";
  8. Person.prototype.getInfo = function
  9. {
  10. alert(this.username + ", " + this.password);
  11. }
  12. var person = new Person;
  13. var person2 = new Person;
  14. person.username = "lisi";
  15. person.getInfo;
  16. person2.getInfo;
  17. */

[html] view plain copy print?

  1. function Person
  2. {
  3. }
  4. Person.prototype.username = new Array;
  5. Person.prototype.password = "123";
  6. Person.prototype.getInfo = function
  7. {
  8. alert(this.username + ", " + this.password);
  9. }
  10. var person = new Person;
  11. var person2 = new Person;
  12. person.username.push("zhangsan");
  13. person.username.push("lisi");
  14. person.password = "456";
  15. person.getInfo;
  16. person2.getInfo;

如果使用原型方式对象,那么生成的所有对象会共享原型中的属性,这样一个对象改变了该属性也会反应到其他对象当中。

单纯使用原型方式定义对象无法在构造函数中为属性赋初值,只能在对象生成后再去改变属性值。

使用原型+构造函数方式来定义对象,对象之间的属性互不干扰,各 个对象间共享同一个方法

[html] view plain copy print?

  1. //使用原型+构造函数方式来定义对象
  2. function Person
  3. {
  4. this.username = new Array;
  5. this.password = "123";
  6. }
  7. Person.prototype.getInfo = function
  8. {
  9. alert(this.username + ", " + this.password);
  10. }
  11. var p = new Person;
  12. var p2 = new Person;
  13. p.username.push("zhangsan");
  14. p2.username.push("lisi");
  15. p.getInfo;
  16. p2.getInfo;

5)动态原型方式:在构造函数中通过标志量让所有对象共享一个方法,而每个对象拥有自己的属性。

[html] view plain copy print?

  1. function Person
  2. {
  3. this.username = "zhangsan";
  4. this.password = "123";
  5. if(typeof Person.flag == "undefined")
  6. {
  7. alert("invoked");
  8. Person.prototype.getInfo = function
  9. {
  10. alert(this.username + ", " + this.password);
  11. }
  12. Person.flag = true;
  13. }
  14. }
  15. var p = new Person;
  16. var p2 = new Person;
  17. p.getInfo;
  18. p2.getInfo;

JavaScript中的继承。

1) 对象冒充

[html] view plain copy print?

  1. //继承第一种方式:对象冒充
  2. function Parent(username)
  3. {
  4. this.username = username;
  5. this.sayHello = function
  6. {
  7. alert(this.username);
  8. }
  9. }
  10. function Child(username, password)
  11. {
  12. //下面三行代码是最关键的代码
  13. this.method = Parent;
  14. this.method(username);
  15. delete this.method;
  16. this.password = password;
  17. this.sayWorld = function
  18. {
  19. alert(this.password);
  20. }
  21. }
  22. var parent = new Parent("zhangsan");
  23. var child = new Child("lisi", "1234");
  24. parent.sayHello;
  25. child.sayHello;
  26. child.sayWorld;

2) call方法方式。

call方法是Function对象中的方法,因此我们定义的每个函数都拥有该方法。可以通过函数名来调用call方法,call方法的第一个参数会被传递给函数中的this,从第2个参数开始,逐一赋值给函数中的参数。

[html] view plain copy print?

  1. <p//使用call方式实现对象的继承</p<pfunction Parent(username)
  2. {
  3. this.username = username;</p<p this.sayHello = function
  4. {
  5. alert(this.username);
  6. }
  7. }</p<pfunction Child(username, password)
  8. {
  9. Parent.call(this, username);</p<p this.password = password;</p<pthis.sayWorld = function
  10. {
  11. alert(this.password);
  12. }
  13. }</p<pvar parent = new Parent("zhangsan");</p<pvar child = newChild("lisi", "123");</p<pparent.sayHello;</p<pchild.sayHello;
  14. child.sayWorld;</p<p
  15. </p<span style="font-size:18px;"<span style="color:#000000;"</span</span

3) apply方法方式

[html] view plain copy print?

  1. //使用apply方法实现对象继承
  2. function Parent(username)
  3. {
  4. this.username = username;
  5. this.sayHello = function
  6. {
  7. alert(this.username);
  8. }
  9. }
  10. function Child(username, password)
  11. {
  12. Parent.apply(this, new Array(username));
  13. this.password = password;
  14. this.sayWorld = function
  15. {
  16. alert(this.password);
  17. }
  18. }
  19. var parent = new Parent("zhangsan");
  20. var child = new Child("lisi", "123");
  21. parent.sayHello;
  22. child.sayHello;
  23. child.sayWorld;

4)原型链方式(无法给构造函数传参数)

[html] view plain copy print?

  1. //使用原型链(prototype chain)方式实现对象继承
  2. function Parent
  3. {
  4. }
  5. Parent.prototype.hello = "hello";
  6. Parent.prototype.sayHello = function
  7. {
  8. alert(this.hello);
  9. }
  10. function Child
  11. {
  12. }
  13. Child.prototype = new Parent;
  14. Child.prototype.world = "world";
  15. Child.prototype.sayWorld = function
  16. {
  17. alert(this.world);
  18. }
  19. var child = new Child;
  20. child.sayHello;
  21. child.sayWorld;

5)混合方式(推荐)

[html] view plain copy print?

  1. //使用混合方式实现对象继承(推荐)
  2. function Parent(hello)
  3. {
  4. this.hello = hello;
  5. }
  6. Parent.prototype.sayHello = function
  7. {
  8. alert(this.hello);
  9. }
  10. function Child(hello, world)
  11. {
  12. Parent.call(this, hello);
  13. this.world = world;
  14. }
  15. Child.prototype = new Parent;
  16. Child.prototype.sayWorld = function
  17. {
  18. alert(this.world);
  19. }
  20. var child = new Child("hello", "world");
  21. child.sayHello;
  22. child.sayWorld;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值