我理解如何实例化对象并调用它们,但我找不到在脚本中使用它们的理由。我能做到
var obj = {
hi: function() {
return "Hello";
}
};
但为什么我不能像以下那样做:
function hi() {
return "Hello";
}
我从来没有理解为什么我应该使用原型设计。我在JavaScript中做的大多数事情都可以在没有对象的情况下完成。但我想使用对象。什么是对象以及我应该使用它们的原因是什么?
答案 0 :(得分:14)
对象非常有用,例如,可以使用属于一起的值创建单个单元。例如:
function Person(firstName, lastName, gender, age) {
this.firstName = firstName;
this.lastName = lastName;
this.gender = gender;
this.age = age;
}
Person.prototype = {
getFullName: function() { return this.firstName + ' ' + this.lastName; },
isMale: function() { return this.gender == 'Male'; },
isFemale: function() { return this.gender == 'Female'; }
};
var amanda = new Person('Amanda', 'Smith', "Female", 42);
var john = new Person('John', 'Doe', 'Male', 72);
alert(amanda.getFullName());
alert(john.isMale());
与较不结构化的相比:
function getFullName(firstName, lastName) {
return firstName + ' ' + lastName;
}
function isMale(gender) {
return gender == 'Male';
}
function isFemale(gender) {
return gender == 'Female';
}
var amandaFirstName = 'Amanda';
var amandaLastName = 'Smith';
var amandaGender = 'Female';
var amandaAge = 42;
var johnFirstName = 'John';
var johnLastName = 'Doe';
var johnGender = 'Male';
var johnAge = 72;
alert(getFullName(amandaFirstName, amandaLastName));
alert(isMale(johnGender));
答案 1 :(得分:5)
对象很有用,因为
如果您不需要非全局状态,不需要查找表,并且您的问题很小或更容易在功能上分解,那么请不要使用对象。
答案 2 :(得分:4)
如果没有你所指的对象,你将会在整个地方拥有松散的功能。这通常会导致代码很难维护。在最起码的对象中,您可以将函数组合在一起以模拟命名空间 - 这是最低限度的。
答案 3 :(得分:2)
在你的简单例子中,写一个半“类”/对象来保存该方法确实没有意义。但是当你的代码增长时,你会得到越来越多的函数和方法,你真的不想将它们全部放在一个大的(全局)命名空间中。这对于维护来说是不可能的,没有人会在稍后的某些时候理解包含你的代码。
这是将对象/“类”中的方法组合在一起的第一个好理由。另一个很好的理由是重新使用。如果您正在编写能够继承其方法的对象,则可以重新创建另一个对象并从那里对其进行抽象。最简单的概念,但如果您将应用程序中的“东西”描述为模块/对象,则希望使用它。
答案 4 :(得分:0)
它试图模拟所有的OOP范例。有很多方法可以做到这一点。但问问自己,'你'喜欢'属于'obj'还是它可以是一个独立的功能?它的全部内容与对象的功能有多密切相关。该函数是否需要访问对象私有变量等?
答案 5 :(得分:0)
这不是“Javascript中的对象”,而是更多的一般对象“问题。
我会说最相关的Javascript关于对象的Javascript特有的唯一一点是它们在命名空间时的巧妙使用。例如,大多数Javascript库将所有内容打包在一个对象中以避免名称空间冲突:
dojo.create( ... )
dojo.connect( ... )
至于为什么有OOP的其他问题,我认为OOP有两个基本的东西(通用的,愚蠢的,例子如下):
动态调度 - 摆脱“ifs”并将责任放在它所属的位置
当您查看具有大量“切换”的代码时:
function doStuff(animal){
if animal is a tiger:
print_tiger_roar();
else if animal is a cow
print_cow_moo();
if animal is a tiger:
print_tiger_wants_meat();
else if animal is a cow
print cow_wants_grass();
将每种不同类型的行为捆绑在不同类型的对象中并使用动态调度可能是个好主意:
function doStuff(animal):
animal.print_speak();
animal.print_food_type();
现在,如果你将来想出另一种动物,你不需要去寻找你的代码来添加它 - 你需要做的就是用适当的print_speack和print_food_type方法创建一个新类其余代码不会发现任何事情。
继承+重用方法
在普通的OO语言中,每个对象为其实例变量存储(并花费内存),而所有方法+静态变量都由类存储在一个地方。 Javascript没有类,但它有原型,最后它们提供相同的基本功能。
答案 6 :(得分:0)
关于“为什么”部分的一些通用思想:
存在用于通信的对象。这是参与项目的每个人的常用词汇。人们习惯于对事物(对象)及其操作(消息或方法)进行操作,而不仅仅是对不连贯的动作(功能)进行操作。