2

这个可能的重复对我没有帮助,因为类似的问题,我在面试中失败了。

这个想法是创建一个使用and的人Object,他是老师的父亲和 Manager 的祖父。类似的东西经理->老师->人module patterninheritance

我的代码看起来像这样(我的 Plunk):

(function(undef)
{
    /**Waiting till document is ready before applying next functions*/
    $(document).ready(function(){

        var person = new APP.Person('Aria Stark','223232');
        document.write(person.getDetails());
    })();

     var APP = {};

     APP.Person =(function() {

        function Person(name, ID) {
            this.name = name;
            this.ID = ID;
        }

        Person.prototype.getDetails = function() {
            return " name: " + this.name + " ID: " + this.ID;
        };

        return Person;
    });

    APP.Teacher =(function () {

        function Teacher(name, ID, salary, hatColor) {
            APP.Person.call(this, name, ID);
            this.salary = salary;
            this.hatColor = hatColor;
        }

        Teacher.prototype = new APP.Person();

        Teacher.prototype.getDetails = function() {
            return APP.Person.call(this) + " Salary: " + this.salary + " Hat: " + this.hatColor;
        };

        return Teacher;
    });


    APP.Manager =(function () {

        function Manager(name, ID, salary, hatColor, car) {
            APP.Teacher.call(this, name, ID, salary, hatColor);
            this.car = car;
        }

        Manager.prototype = new APP.Teacher();

        Manager.prototype.getDetails = function() {
            return APP.Teacher.call(this) + " Car: " + this.car;
        };

        return Manager;
    });


})(); 

我在第一行得到一个错误:

var person = new APP.Person('Aria Stark','22323');

错误是:Uncaught TypeError: object is not a function

有人可以帮我吗?我也愿意听取对此代码的其他改进。

4

3 回答 3

3

这是您创建(和调用)自执行函数或 IIFE 的方式

(function () {})();

简单(function () {})的写不调用函数,在这种情况下实际上并没有什么实际作用。用你的方式APP.Person将是一个函数,它在调用时Person返回另一个函数(构造函数)- 它不能很好地与.new

另外,对于documentready,你不希望执行调用的结果.ready,只需传递function作为参数,它会在事件触发时被调用:

$(document).ready(function(){
}); //removed () from here

面对这些变化

于 2014-01-14T11:02:51.743 回答
1

你所有的对象都是这样声明的:

APP.X=(function() {
    function Y() {}
    Y.prototype.method= function() {};
    return Y;
});

这本身并没有错,尽管有点奇怪。你想要的是这样的:

APP.X=(function() {
    function X() {}
    X.prototype.method= function() {};
    return X;
})(); // actually call the anonymous function you used to encapsulate variables

再说一次,你为什么要为 IIFE 烦恼?你也可以这样做:

APP.X = function () {}
X.prototype.method= function() {};

封装它们绝对不会带来任何东西,没有什么私人的东西可以隐藏在外部范围内。


此外,我的帖子可能比 StackOverflow 更适合 CodeReview,但您的继承模型存在重大问题。您的 Teacher.prototype 是一个不带参数创建的 Person 实例。只有在高度限制的情况下才会安全。

一个更好的模型是这个:

Teacher = function(){
    Person.call(this /*, person parameters*/);
}
Teacher.prototype = Object.create(Person.prototype);

SO处理这个特定问题有很多很好的答案,是我的一个。

于 2014-01-14T11:05:49.650 回答
0

不需要 jQuery 来创建这些东西。好吧,我对此没有很好的曝光,但我试图展示你想知道的东西:

// Creating Person Class
var Person = function(name, id){
    this.name = name;
    this.id = id;
};

Person.prototype.getInfo = function(){
    return "name: " + this.name + ",  id: " + this.id;
};

// Instance of Person
var x = new Person("Ashish", 1);
x.getInfo();

// Creating Teacher Class
var Teacher = function(name, id, salary, hatColor){
    Person.call(this, name, id);
    this.salary = salary;
    this.hatColor = hatColor;
};

// Inheriting Persons methods
Teacher.prototype = new Person();

// Adding new method to it
Teacher.prototype.getFullDetails = function(){
    return this.getInfo() + ", salary: " + this.salary + ", Hatcolor: " + this.hatColor;
}

// Instance of Teacher Class
var teacher = new Teacher("John", 2, 15000, "red");
teacher.getInfo(); //output: "name: John,  id: 2"
teacher.getFullDetails(); // output : "name: John,  id: 2, salary: 15000, Hatcolor: red"
console.log(teacher.salary); // output : 15000

因此,您可以在上面看到: -Person使用 2 个属性和一个方法创建了一个类。- 然后我们创建了一个Teacher类并从其中的类继承方法Person。- 然后添加了另一个在其中调用getFullDetails()的方法,该方法访问来自Person类的方法。

这就是您在 DOM.ready 中所做的事情:

alert(x.getInfo()); // in my example:

在您的示例中:

var APP = {};
APP.Person = function Person(name, ID) {
    this.name = name;
    this.ID = ID;
}

APP.Person.prototype.getDetails = function () {
    return " name: " + this.name + " ID: " + this.ID;
};

var person = new APP.Person('Aria Stark', '223232');
alert(person.getDetails());
于 2014-01-14T11:18:33.987 回答