在javascript中,所有的方法都有一个call方法和apply方法.这两个方法可以模拟对象调用方法.它的第一个参数是对象,后面的
参数表示对象调用这个方法时的参数(ECMAScript specifies two methods that are defined for all functions, call()
and apply(). These methods allow you to invoke a function as if it were a method of some other object. The first
argument to both call() and apply() is the object on which the function is to be invoked; this argument becomes
the value of the this keyword within the body of the function. Any remaining arguments to call() are the values
that are passed to the function that is invoked).比如我们定义了一个方法f(),然后调用下面的语句:
f.call(o, 1, 2);
作用就相当于
o.m = f;
o.m(1,2);
delete o.m;
举个例子:
- function Person(name,age) {
- this.name = name;
- this.age = age;
- }
- var o = new Object();
- alert(o.name + "_" + o.age);
-
- Person.call(o,"sdcyst",18);
- alert(o.name + "_" + o.age);
-
- Person.apply(o,["name",89]);
- alert(o.name + "_" + o.age);
function Person(name,age) { //定义方法
this.name = name;
this.age = age;
}
var o = new Object(); //空对象
alert(o.name + "_" + o.age); //undefined_undefined
Person.call(o,"sdcyst",18); //相当于调用:o.Person("sdcyst",18)
alert(o.name + "_" + o.age); //sdcyst_18
Person.apply(o,["name",89]);//apply方法作用同call,不同之处在于传递参数的形式是用数组来传递
alert(o.name + "_" + o.age); //name_89
---------------------------------
实例变量和实例方法都是通过实例对象加"."操作符然后跟上属性名或方法名来访问的,但是我们也可以为类来设置方法或变量,
这样就可以直接用类名加"."操作符然后跟上属性名或方法名来访问.定义类属性和类方法很简单:
- Person.counter = 0;
- function Person(name,age) {
- this.name = name;
- this.age = age;
- Person.counter++;
- };
-
- Person.whoIsOlder = function(p1,p2) {
- if(p1.age > p2.age) {
- return p1;
- } else {
- return p2;
- }
- }
-
- var p1 = new Person("p1",18);
- var p2 = new Person("p2",22);
-
- alert("现在有 " + Person.counter + "个人");
- var p = Person.whoIsOlder(p1,p2);
- alert(p.name + "的年龄较大");
Person.counter = 0; //定义类变量,创建的Person实例的个数
function Person(name,age) {
this.name = name;
this.age = age;
Person.counter++; //没创建一个实例,类变量counter加1
};
Person.whoIsOlder = function(p1,p2) { //类方法,判断谁的年龄较大
if(p1.age > p2.age) {
return p1;
} else {
return p2;
}
}
var p1 = new Person("p1",18);
var p2 = new Person("p2",22);
alert("现在有 " + Person.counter + "个人"); //现在有2个人
var p = Person.whoIsOlder(p1,p2);
alert(p.name + "的年龄较大"); //p2的年龄较大
prototype属性的应用:
下面这个例子是根据原书改过来的.
假设我们定义了一个Circle类,有一个radius属性和area方法,实现如下:
- function Circle(radius) {
- this.radius = radius;
- this.area = function() {
- return 3.14 * this.radius * this.radius;
- }
- }
- var c = new Circle(1);
- alert(c.area());
function Circle(radius) {
this.radius = radius;
this.area = function() {
return 3.14 * this.radius * this.radius;
}
}
var c = new Circle(1);
alert(c.area()); //3.14
假设我们定义了100个Circle类的实例对象,那么每个实例对象都有一个radius属性和area方法,
实际上,除了radius属性,每个Circle类的实例对象的area方法都是一样,这样的话,我们就可以
把area方法抽出来定义在Circle类的prototype属性中,这样所有的实例对象就可以调用这个方法,
从而节省空间.
- function Circle(radius) {
- this.radius = radius;
- }
- Circle.prototype.area = function() {
- return 3.14 * this.radius * this.radius;
- }
- var c = new Circle(1);
- alert(c.area());
function Circle(radius) {
this.radius = radius;
}
Circle.prototype.area = function() {
return 3.14 * this.radius * this.radius;
}
var c = new Circle(1);
alert(c.area()); //3.14
现在,让我们用prototype属性来模拟一下类的继承:首先定义一个Circle类作为父类,然后定义子类
PositionCircle.
- function Circle(radius) {
- this.radius = radius;
- }
- Circle.prototype.area = function() {
- return this.radius * this.radius * 3.14;
- }
-
- function PositionCircle(x,y,radius) {
- this.x = x;
- this.y = y;
- Circle.call(this,radius);
-
- }
- PositionCircle.prototype = new Circle();
-
- var pc = new PositionCircle(1,2,1);
- alert(pc.area());
-
-
- alert(pc.radius);
-
-
-
-
-
-
-
- alert(pc.constructor);
-
-
-
-
- PositionCircle.prototype.constructor = PositionCircle
- alert(pc.constructor);
分享到:
相关推荐
JavaScript是一种广泛应用于...以上是JavaScript面向对象技术的一些基础知识。通过理解并熟练运用这些概念,开发者能够编写出更清晰、更易于维护的代码。对于JavaScript初学者来说,掌握这些基础是进阶学习的关键步骤。
JavaScript面向对象技术是该编程语言非常核心的一个部分,它允许开发者使用对象来组织代码,并模拟现实世界中的实体。在JavaScript中,几乎所有的东西都可以被视为对象,包括基本数据类型如数字和字符串。对象包含...
本文将深入浅出地讲解JavaScript中的面向对象技术基础,包括对象、数组、函数、类、构造函数以及原型等方面的知识。 首先,让我们来看看对象和数组。在JavaScript中,对象是键值对的集合,这些键通常是字符串,对应...
本文介绍了JavaScript面向对象编程的基本概念和技术细节,包括变量和对象的基础用法、函数的作用以及如何通过封装和继承来构建复杂的对象层次结构。JavaScript的独特之处在于它的灵活性和动态性,这使得它成为了一种...
总而言之,学习现代JavaScript面向对象编程,有助于开发者在认识这门语言演化的基础上,运用面向对象的设计和编程模式来构建更加健壮和可维护的JavaScript应用程序。同时,测试和调试是保证代码质量不可或缺的环节,...
通过以上内容,我们可以了解到JavaScript面向对象编程的基础知识以及它的核心概念。在实际应用中,理解并熟练运用这些知识点,将有助于开发出更加结构化和可维护的代码。同时,参与Java学习群和听讲大神的课程将是一...
### JavaScript面向对象编程知识点概述 #### 一、现代JavaScript编程概览 - **JavaScript的演进**:自诞生以来,JavaScript经历了从一个简单的脚本语言到现今被广泛应用于构建复杂应用的强大编程语言的过程。它的...
JavaScript面向对象技术在实现树形控件中扮演着至关重要的角色。树形控件是一种用于展示层次型数据的用户界面元素,它具有扩展和折叠功能,可以在有限的空间内清晰地展示大量的信息,使得数据间的层级关系一目了然。...
《JavaScript内核系列》和《JavaScript面向对象基础》这两本书是深入理解JavaScript编程的重要资源。JavaScript,作为一种广泛应用于Web开发的脚本语言,其内核和面向对象特性是开发者必须掌握的基础知识。以下是对...
标题“JavaScript经典面向对象设计”指出了本书的主要内容是关于如何使用面向对象编程(OOP)原则和技术来编写高质量、可扩展且可重用的JavaScript应用程序及库。描述中提到本书相比其他中文资料更为清晰,深入到...
从所提供的文件信息中,我们可以总结以下几点与“JavaScript面向对象编程指南 第2版 高清 带索引书签目录_样章.pdf”相关的重要知识点。 首先,该文件提到的书籍是关于JavaScript面向对象编程的,面向对象编程...
JavaScript是一种基于原型的面向对象编程语言,它的面向对象技术基础包括对象、数组、原型、作用域、闭包以及模拟私有变量等核心概念。下面将详细介绍这些知识点。 **1. 对象与数组** 在JavaScript中,对象是键值...
在本篇文章中,作者详细阐述了JavaScript面向对象编程的几个关键特性,并通过代码示例展示了这些特性的具体应用。首先,我们来了解几个核心概念:类、静态成员、对象和重载。 类在面向对象编程中扮演着基础的角色,...