搜索

[每日一练]面向对象JavaScript继承例子一

0714

	function Person(){
		this.name;
		this.age;
		this.sex;

		this.getName = function(){
			return this.name;
		}

		this.getSex = function(){
			return this.sex;
		}

		this.getAge = function(){
			return this.age;
		}
	}

	function Girl(){
		this.sex = "female";
		this.isSingle = true;
	}

	Girl.prototype = new Person();
	var jessica = new Girl();
	jessica.name = "Jessica";
	jessica.age = "24";

RyanDing指点出JS也可以写得很有“性能”。上一段JS代码在效率上就很有问题,每次实例化的时候都需要将 getName,getSex , getSex 给实例化出来。这些东西可以放在js特有的原型内。

对比下修改后的JS代码:


		function Person() {
		    this.name;  // 值传递,每次实例化后都会重新建立一个副本
		     this.age;
		    this.sex;
		}

		//实例化对象后进行引用传递不会建立新的内存副本。提高js性能
		Person.prototype.getName = function () {
		    return this.name;
		}

		Person.prototype.getSex = function () {
		    return this.sex;
		}

		Person.prototype.getAge = function(){
			return this.age;
		}

        function Girl() {
            this.sex = "female";
            this.isSingle = true;
        }

        // 将Girl的原型指向Person的一个实例
        // 因为Person的实例可以调用Person原型中的方法, 所以Girl的实例也可以调用Person原型中的所有属性
        Girl.prototype = new Person();
        var jessica = new Girl();
        jessica.name = "Jessica";
        jessica.age = "24";

在面向对象的语言中,使用类来创建一个自定义对象。在JavaScript中一切都可以是对象,用什么办法来创建一个自定义对象?

在这引入另外一个概念 – 原型(prototype)。函数Person称为构造函数,也就是创建自定义对象的函数。可以看出,JavaScript通过构造函数和原型的方式模拟实现了类的功能。 Girl从Person继承了原型prototype中的所有属性。

对比一下C#代码:


	public class Person{
		public string name{
			set;
			get;
		}
		public string sex{
			set;
			get;
		}
		public string age{
			set;
			get;
		}
	}

	public class Girl : Person{
		base.sex = "female";
		public bool isSingle = true;

	}

	static void Main(string[] args){
		Girl jessica = new Girl();
		jessica.name = "Jessica";
		jessica.age = "24";
	}

继续学习ing……

3 位同学留下了脚印

  1. 斌斌 2011-09-20

    我来加一个外链

    回复
  2. George Wing 2011-07-15

    灵活的运用匿名函数(也叫lambda) 也可以 实现模式。

    回复
  3. George Wing 2011-07-15

    呃,别拿C#这种静态、编译型语言来比,可以拿PHP、Ruby这种动态、解释型 的来比。
    JS基于原型的继承是源自Self语言,与类式继承不同。

    回复

同学有话要说吗?