1. 在javascript中,function也是一个对象,具有二重性,即,可以被调用,也可以被作为普通对象来使用.
当function作为方法时,在其名称后面加上(),即可完成方法调用.
当function作为对象时,它具有一系列的方法和属性
定义一个function可用如下方法:
function func(x)
{
alert(x);
}
func(“blah”);
或者也可以用:
var func = function(x)
{
alert(x);
};
func(“blah2”);
也可以用:
var func = new Function(“x”, “alert(x);”);
func(“blah3”);
这种方式,使用函数对象的构造函数Function了构造一个function对象.
关于Function对象,可参考 http://www.w3school.com.cn/js/pro_js_functions_function_object.asp
2. Javascript中没有类(class)
如果要在javascript中定义一个class需要使用function
比如:
function Person(name,age)
{
this.name= name;
this.age= age;
}
这里就定义了一个Person类.
当需要一个Person实例的时候,可以使用new关键字.
比如:
aGuy = new Person('jack',29);
“new”运算符执行的操作很简单。首先,它创建一个新的空对象。然后执行紧随其后的函数调用,将新的空对象设置为该函数中“this”的值。换句话说,可以认为上面这行包含“new”运算符的代码与下面两行代码的功能相当:
var aGuy = {};
Person.call( aGuy, “Spot”);
上面两种方式创建的aGuy对象时不同的,new方式创建的对象属性更多,具体可使用chrome,调用console.log(aGuy);查看
第一种:
-
age: 29
-
name: "jack"
-
__proto__: Person
-
constructor: function Person(name,age)
-
__proto__: Object
第二种:Object {name: "jack", age: 29}
(注:
call方法是Function对象的一个方法,类似的还有apply方法,
call方法参数不确定,第一个参数是要传递到函数中作为this的,从第二个参数开始,对应要调用函数的参数
apply方法参数有两个,第一个参数和call第一个参数相同,第二个参数是一个数组,保存需要传递到调用函数的参数.
3. 为javascript类添加方法
(1)第一种方式,在作为class的function中,将一个function作为方法,比如:
// Think of this as class Dog
function Dog(name) {
// instance variable
this.name = name;
// instance method? Hmmm...
this.respondTo = function(name) {
if(this.name == name) {
alert(“Woof”);
}
};
}
var spot = new Dog(“Spot”);
这里的respondTo就定义了一个方法.
在上面的 Dog 定义中,我定义了名为 name 的实例变量。使用 Dog 作为其构造函数所创建的每个对象都有它自己的实例变量名称副本(前面提到过,它就是对象词典的条目)。这就是希望的结果。毕竟,每个对象都需要它自己的实例变量副本来表示其状态。但如果看看下一行,就会发现每个 Dog 实例也都有它自己的 respondTo 方法副本,这是个浪费;您只需要一个可供各个 Dog 实例共享的 respondTo 实例!通过在 Dog 以外定义 respondTo,可以避免此问题,如下所示:
function respondTo() {
// respondTo definition
}
function Dog(name) {
this.name = name;
// attached this function as a method of the object
this.respondTo = respondTo;
}
(2)第二种方式,需要先了解 javascript的原型(prototype)
每一个function都有一个属性prototype(原型),这个prototype属性也是一个对象,它也有自己的prototype属性,这样 就形成了prototype链(原型链),这个原型链的终点是Object.prototype,因为Object.prototype指向null.
函数(function)的prototype对象有一个constructor属性,指向function,这样就形成了循环引用.
var spot = new Dog(“Spot”);
// Dog.prototype is the prototype of spot
alert(Dog.prototype.isPrototypeOf(spot));
// spot inherits the constructor property
// from Dog.prototype
alert(spot.constructor == Dog.prototype.constructor);
alert(spot.constructor == Dog);
// But constructor property doesn’t belong
// to spot. The line below displays “false”
alert(spot.hasOwnProperty(“constructor”));
// The constructor property belongs to Dog.prototype
// The line below displays “true”
alert(Dog.prototype.hasOwnProperty(“constructor”));
当您尝试访问对象的属性/方法时,JavaScript 将检查该属性/方法是否是在该对象中定义的。如果不是,则检查对象的原型。如果还不是,则检查该对象的原型的原型,如此继续,一直检查到 Object.prototype。
JavaScript 动态地解析属性访问和方法调用的方式产生了一些特殊效果:
- 继承原型对象的对象上可以立即呈现对原型所做的更改,即使是在创建这些对象之后。
- 如果在对象中定义了属性/方法 X,则该对象的原型中将隐藏同名的属性/方法。例如,通过在 Dog.prototype 中定义 toString 方法,可以改写 Object.prototype 的 toString 方法。
- 更改只沿一个方向传递,即从原型到它的派生对象,但不能沿相反方向传递。
下面这个例子显示了如何解决前面遇到的不需要的方法实例的问题。通过将方法放在原型内部,可以使对象共享方法,而不必使每个对象都有单独的函数对象实例。在此示例中,rover 和 spot 共享 getBreed 方法,直至在 spot 中以任何方式改写 toString 方法。此后,spot 有了它自己版本的 getBreed 方法,但 rover 对象和用新 GreatDane 创建的后续对象仍将共享在 GreatDane.prototype 对象中定义的那个 getBreed 方法实例。
function GreatDane() { }
var rover = new GreatDane();
var spot = new GreatDane();
GreatDane.prototype.getBreed = function() {
return “Great Dane”;
};
// Works, even though at this point
// rover and spot are already created.
alert(rover.getBreed());
// this hides getBreed() in GreatDane.prototype
spot.getBreed = function() {
return “Little Great Dane”;
};
alert(spot.getBreed()); //当前对象覆盖了prototype中的getBreed(),但是不影响其他从prototype///继承的getBreed(),因为其他对象并没有覆盖这个方法
// but of course, the change to getBreed
// doesn’t propagate back to GreatDane.prototype
// and other objects inheriting from it,
// it only happens in the spot object
alert(rover.getBreed());
参考:http://msdn.microsoft.com/zh-cn/magazine/cc163419.aspx
参考: http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html
分享到:
相关推荐
在JavaScript中,面向对象主要体现在三个方面:封装、继承和多态。下面我们将详细探讨这三个概念。 **1. 封装** 封装是面向对象编程的基本原则,它隐藏了对象内部的实现细节,只对外提供公共的访问接口。在...
在提供的资源中,《代码之美》PDF文件可能包含了关于编程实践和代码风格的指导,而《Javascript面向对象编程》PPT可能更具体地阐述了JavaScript OOP的细节和示例。学习这些材料将有助于深入理解JavaScript的面向对象...
在深入讲解JavaScript面向对象与原型的知识点之前,首先需要了解JavaScript的基础知识。在JavaScript中,面向对象编程(OOP)的概念虽然存在,但是它的实现与传统基于类的语言有所不同。ECMAScript,也就是...
在IT行业中,面向对象编程(Object-Oriented Programming, OOP)是一种常用的设计模式,它将数据和操作数据的方法组织成对象,使得代码更易于理解和维护。在JavaScript中,我们通常使用类(class)来实现面向对象的...
在探讨面向对象的JavaScript之前,我们首先需要了解面向对象编程(Object-Oriented Programming, OOP)的基本特性:封装性、抽象性、继承性和多态性。 ##### 8.1.1 封装性 **定义:** 封装性是面向对象编程的一个...
本文介绍了JavaScript面向对象编程的基本概念和技术细节,包括变量和对象的基础用法、函数的作用以及如何通过封装和继承来构建复杂的对象层次结构。JavaScript的独特之处在于它的灵活性和动态性,这使得它成为了一种...
在这个“JavaScript面向对象基础”的资料中,我们将会探讨JavaScript中的类、对象、封装、继承以及多态等关键概念。 1. **对象与对象字面量** 在JavaScript中,对象是由键值对组成的无序集合,可以使用对象字面量...
3. **原型和原型链** - JavaScript对象都有一个内置的`__proto__`属性,指向其构造函数的原型。原型是一个对象,可以包含共享的属性和方法。原型链允许对象访问其构造函数原型上的属性和方法。 - 使用`Object....
4. 继承:在JavaScript中,对象可以通过原型链继承其他对象的属性和方法。原型链是一个对象的原型可以指向另一个对象的原型,这样就在不同对象间形成了一条链,从而实现继承。 5. 封装:封装是面向对象编程的一个...
在JavaScript中,面向对象主要通过构造函数、原型链、原型对象和闭包等机制来实现。 1. **构造函数**:构造函数在JavaScript中扮演着类的角色,它们通常用来初始化新创建的对象。我们可以通过`new`关键字调用构造...
本指南将深入探讨JavaScript中的面向对象特性,包括类、对象、继承、封装和多态性。 1. **对象和对象字面量** JavaScript中的对象是键值对的集合,可以通过对象字面量{}来创建。例如: ```javascript let person...
《JavaScript面向对象精要》这本书不仅介绍了JavaScript面向对象的基础概念,还深入探讨了其实现机制及其在实际开发中的应用。对于希望提高自己JavaScript技能水平的开发者来说,本书是一本不可多得的好书。通过学习...
《Object-Oriented JavaScript》这本书不仅深入介绍了面向对象编程的基础理论,还提供了大量的实际代码示例和最佳实践指导。对于希望提高JavaScript开发技能、编写出高质量、可扩展和可重用代码的开发者来说,这本书...
下面我们将详细探讨JavaScript面向对象的基础知识。 1. **对象和数据类型**: 在JavaScript中,一切都是对象,包括基本数据类型(如字符串、数字、布尔值)。然而,与数字或字符串不同,对象是键值对的集合,可以...
本文将详细介绍JavaScript中的面向对象编程概念和技术,包括类定义、对象创建、继承、封装等内容。 #### 二、类定义和对象创建 ##### 2.1 类定义 在JavaScript中,“类”这一概念并不像在Java或C#这样的强类型...
3. **原型和原型链** JavaScript中的每个对象都有一个`__proto__`属性,指向它的原型对象。原型链是由这些原型对象构成的链状结构,用于实现继承。`Object.prototype`是所有对象的顶级原型。 4. **构造函数与new...
面向对象编程(Object-Oriented Programming,OOP)是一种强大的编程范式,它基于“对象”的概念,允许我们通过封装数据和方法来组织代码。在JavaScript中,面向对象编程并不是原生支持的,但它可以通过模拟类和对象...