`

Javascript面向对象-- 1-- 【基础-function对象和prototype--原型链-封装】

阅读更多

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);查看
第一种:
Person
  1. age29
  2. name"jack"
  3. __proto__Person
    1. constructorfunction Person(name,age)
    2. __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面向对象-动力节点共7页.pdf.z

    在JavaScript中,面向对象主要体现在三个方面:封装、继承和多态。下面我们将详细探讨这三个概念。 **1. 封装** 封装是面向对象编程的基本原则,它隐藏了对象内部的实现细节,只对外提供公共的访问接口。在...

    Javascript面向对象编程.

    在提供的资源中,《代码之美》PDF文件可能包含了关于编程实践和代码风格的指导,而《Javascript面向对象编程》PPT可能更具体地阐述了JavaScript OOP的细节和示例。学习这些材料将有助于深入理解JavaScript的面向对象...

    第15章 javascript面向对象与原型

    在深入讲解JavaScript面向对象与原型的知识点之前,首先需要了解JavaScript的基础知识。在JavaScript中,面向对象编程(OOP)的概念虽然存在,但是它的实现与传统基于类的语言有所不同。ECMAScript,也就是...

    axios 面向对象封装

    在IT行业中,面向对象编程(Object-Oriented Programming, OOP)是一种常用的设计模式,它将数据和操作数据的方法组织成对象,使得代码更易于理解和维护。在JavaScript中,我们通常使用类(class)来实现面向对象的...

    Javascript 面向对象的JavaScript进阶

    在探讨面向对象的JavaScript之前,我们首先需要了解面向对象编程(Object-Oriented Programming, OOP)的基本特性:封装性、抽象性、继承性和多态性。 ##### 8.1.1 封装性 **定义:** 封装性是面向对象编程的一个...

    JAVASCRIPT 面向对象编程精要

    本文介绍了JavaScript面向对象编程的基本概念和技术细节,包括变量和对象的基础用法、函数的作用以及如何通过封装和继承来构建复杂的对象层次结构。JavaScript的独特之处在于它的灵活性和动态性,这使得它成为了一种...

    Javascript面向对象基础.rar

    在这个“JavaScript面向对象基础”的资料中,我们将会探讨JavaScript中的类、对象、封装、继承以及多态等关键概念。 1. **对象与对象字面量** 在JavaScript中,对象是由键值对组成的无序集合,可以使用对象字面量...

    JavaScript面向对象编程指南 pdf

    3. **原型和原型链** - JavaScript对象都有一个内置的`__proto__`属性,指向其构造函数的原型。原型是一个对象,可以包含共享的属性和方法。原型链允许对象访问其构造函数原型上的属性和方法。 - 使用`Object....

    JavaScript面向对象编程指南.pdf

    4. 继承:在JavaScript中,对象可以通过原型链继承其他对象的属性和方法。原型链是一个对象的原型可以指向另一个对象的原型,这样就在不同对象间形成了一条链,从而实现继承。 5. 封装:封装是面向对象编程的一个...

    面向对象JavaScript开发

    在JavaScript中,面向对象主要通过构造函数、原型链、原型对象和闭包等机制来实现。 1. **构造函数**:构造函数在JavaScript中扮演着类的角色,它们通常用来初始化新创建的对象。我们可以通过`new`关键字调用构造...

    JavaScript面向对象编程指南

    本指南将深入探讨JavaScript中的面向对象特性,包括类、对象、继承、封装和多态性。 1. **对象和对象字面量** JavaScript中的对象是键值对的集合,可以通过对象字面量{}来创建。例如: ```javascript let person...

    JavaScript面向对象精要(英文版)

    《JavaScript面向对象精要》这本书不仅介绍了JavaScript面向对象的基础概念,还深入探讨了其实现机制及其在实际开发中的应用。对于希望提高自己JavaScript技能水平的开发者来说,本书是一本不可多得的好书。通过学习...

    javascript 经典面向对象设计

    《Object-Oriented JavaScript》这本书不仅深入介绍了面向对象编程的基础理论,还提供了大量的实际代码示例和最佳实践指导。对于希望提高JavaScript开发技能、编写出高质量、可扩展和可重用代码的开发者来说,这本书...

    Javascript面向对象基础

    下面我们将详细探讨JavaScript面向对象的基础知识。 1. **对象和数据类型**: 在JavaScript中,一切都是对象,包括基本数据类型(如字符串、数字、布尔值)。然而,与数字或字符串不同,对象是键值对的集合,可以...

    Javascript面向对象编程

    本文将详细介绍JavaScript中的面向对象编程概念和技术,包括类定义、对象创建、继承、封装等内容。 #### 二、类定义和对象创建 ##### 2.1 类定义 在JavaScript中,“类”这一概念并不像在Java或C#这样的强类型...

    javascript面向对象技术基础

    3. **原型和原型链** JavaScript中的每个对象都有一个`__proto__`属性,指向它的原型对象。原型链是由这些原型对象构成的链状结构,用于实现继承。`Object.prototype`是所有对象的顶级原型。 4. **构造函数与new...

    JavaScript面向对象编程案例

    面向对象编程(Object-Oriented Programming,OOP)是一种强大的编程范式,它基于“对象”的概念,允许我们通过封装数据和方法来组织代码。在JavaScript中,面向对象编程并不是原生支持的,但它可以通过模拟类和对象...

Global site tag (gtag.js) - Google Analytics