1

我试图在 javascript 中学习 OO 技术。大多数网站都使用原型继承。

但是,我试图理解为什么以下内容不好(并且仍然可以实现原型继承可以做的事情):

        //create parent class
    var Person = function (vId, vName) {
        this.Id = vId;
        this.Name = vName;

        this.Display = function () {
            alert("Id=" + this.Id);
        }
    };

    //create new class
    var Emp = function (vId, vName, vOfficeMail) {
        Person.call(this, vId, vName)
        this.OfficeEmail = vOfficeMail;

        this.Display = function () {
            alert("Id=" + this.Id + ", OfficeMail=" + this.OfficeEmail);
        }
    };

    //create instance of child class
    var oEmp = new Emp(1001, "Scott", "a@a.com"); //using Child's constructor
    //call display method in child class
    oEmp.Display();

    //create instance of parent class
    var oPerson = new Person(1002, "Smith"); //using Parent's constructor
    //call display method in parent class
    oPerson.Display();
4

2 回答 2

4

这是我认为最重要的,也是一个简单的解释。

此代码将为每个对象创建一次函数:

this.Display = function () {
    alert("Id=" + this.Id);
}

使用原型,该函数只创建一次并应用于该类型的所有对象。浪费更少的内存和更少的 CPU 功率。

这段代码将显示我在说什么:

var Person = function (vId, vName) {
        this.Id = vId;
        this.Name = vName;

        this.Display = function () {
            alert("Id=" + this.Id);
        }
    };

    var a = new Person(1, 2);
    var b = new Person(3, 4);

    var instanceEqual = (a.Display == b.Display);// false
    alert("Instance functions equal: " + instanceEqual);

    Person.prototype.Display2 = function () {
            alert("Id=" + this.Id);
        }

    var prototypeEqual = (a.Display2 == b.Display2);// true
    alert("Prototype functions equal: " + prototypeEqual);

jsfiddle:http: //jsfiddle.net/nPnrk/

于 2012-07-08T20:16:06.723 回答
2

原型对象允许您将许多对象实例共享的行为都保存在一个地方。如果需要,可以从那里动态更改或扩展它们,其效果是立即更改从原型继承的所有构造对象的功能。

还有其他美好的事情,但对我来说这是最重要的事情。

于 2012-07-08T20:13:52.083 回答