尤其是'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:不需要构造函数或更复杂的东西,比如新关键字。
答案 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()
。
基本上,我们的想法是为每种类型的对象保留数据(例如firstName
,lastName
)和代码(例如print
的实现)。
您可以通过实现构造函数来添加新的对象类型,而无需更改其他代码,这些代码将“神奇地”最终调用print
的正确版本。