关于对象和函数javascript使用的混淆

时间:2013-12-14 11:22:36

标签: javascript

尤其是'this'关键字。像下面的代码一样,使用函数,我可以避免重复代码。我阅读的示例代码越多,我就会越混淆,就像这样可以实现的东西,但还有其他(复杂的)方法可以做到这一点......或者我错了?

var bob = {
    firstName: "Bob",
    lastName: "Jones",
    phoneNumber: "(650) 777-7777",
    email: "bob.jones@example.com"
};

var mary = {
    firstName: "Mary",
    lastName: "Johnson",
    phoneNumber: "(650) 888-8888",
    email: "mary.johnson@example.com"
};

// printPerson added here
function printPerson(person){
    console.log(person.firstName + " " + person.lastName);

}

printPerson(bob);
printPerson(mary);

我的问题是,如何使用this关键字改进上述代码。现在,我已经看到了OOP(或者我错了?)。

extra:不需要构造函数或更复杂的东西,比如新关键字。

2 个答案:

答案 0 :(得分:1)

function Person(firstName, lastName, phoneNumber, eMail) {
    var that = this;
    that.firstName = firstName;
    that.lastName = lastName;
    that.phoneNumber = phoneNumber;
    that.eMail = eMail;
    return {
        printPerson: function() {
            console.log(that.firstName + " " + that.lastName);
        }
    }
};

var person1 = Person("Bruce", "Wayne", "1234", "bane@joker.com");
person1.printPerson();

var person2 = Person("Kent", "Clark", "4321", "me@thesky.com");
person2.printPerson();

答案 1 :(得分:0)

printPerson方法的问题是当你需要“多态”时;即你想要打印一个对象,但你不想知道它是什么类型的对象:假设

function newPerson(firstName, lastName) {
    return { firstName: firstName,
             lastName: lastName };
}

function newPet(name, kind) {
    return { name: name,
             kind: kind };
}

function printPerson(person) {
    console.log(person.firstName + " " + person.lastName);
}

function printPet(pet) {
    console.log(pet.name + " (a nice " + pet.kind + ")");
}

var p1 = newPerson("Andrea", "Griffini");
var p2 = newPet("Tobi", "cat");

printPerson(p1);
printPet(p2);
然而问题是......假设你有一个物体x并且你需要打印它,但是你不知道它是一个人还是一个宠物......你怎么办? 解决方案1正在使用if / then

进行检查
if (x.firstName) {
    printPerson(x);
} else {
    printPet(x);
}

但这很烦人,因为如果你以后添加另一种类型的对象,你需要修复它。

OOP解决方案是稍微改变代码

function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.print = function() {
        console.log(this.firstName + " " + this.lastName);
    };
}

function Pet(name, kind) {
    this.name = name;
    this.kind = kind;
    this.print = function() {
        console.log(this.name + " (a nice " + this.kind + ")");
    };
}

现在使用变为

var p1 = new Person("Andrea", "Griffini");
var p2 = new Pet("Tobi", "cat");

p1.print();
p2.print();

一般x的问题只是x.print()

基本上,我们的想法是为每种类型的对象保留数据(例如firstNamelastName)和代码(例如print的实现)。 您可以通过实现构造函数来添加新的对象类型,而无需更改其他代码,这些代码将“神奇地”最终调用print的正确版本。