JavaScript的原型基础1

一、原型的概述:

  我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法。

  逻辑上可以这么理解:prototype 通过调用构造函数而创建的那个对象的原型对象。

  使用原型的好处可以让所有对象实例共享它所包含的属性和方法。也就是说,不必在构造函数中定义对象信息,而是可以直接将这些信息添加到原型中。

二、使用原型创建对象

  function Box() {}       //声明一个构造函数,函数体内什么都没有,如果有叫做实例属性,实例方法
    Box.prototype.name = ‘Lee‘; //在原型里添加属性
    Box.prototype.age = 100;
    Box.prototype.run = function () { //在原型里添加方法
        return this.name + this.age + ‘运行中...‘;
    };

    /*比较一下原型内的方法地址是否一致:*/
    var box1 = new Box();
    var box2 = new Box();
    alert(box1.run == box2.run); //true,方法的引用地址保持一致

  为了更进一步了解构造函数的声明方式和原型模式的声明方式,我们通过图示来了解一下:

    

  在原型模式声明中,多了两个属性,这两个属性都是创建对象时自动生成的。

  __proto__属性是实例指向原型对象的一个指针,它的作用就是指向构造函数的原型属性 constructor。通过这两个属性,就可以访问到原型里的属性和方法了。

  IE 浏览器在脚本访问__proto__会不能识别,火狐和谷歌浏览器及其他某些浏览器均能识别。虽然可以输出,但无法获取内部信息。

  function Box() {} //声明一个构造函数
    Box.prototype.name = ‘Lee‘; //在原型里添加属性
    Box.prototype.age = 100;
    Box.prototype.run = function () { //在原型里添加方法
        return this.name + this.age + ‘运行中...‘;
    };

    var box1 = new Box();
    var box2 = new Box();

    alert(box1.prototype);//这个属性是一个对象,访问不到
    alert(box1.__proto__); //这个属性是一个指针指向prototype原型对象,  打印结果是[object Object]  在IE中结果是undefined

    /*
    constructor是构造函数的属性,获取构造函数本身
    作用是被原型指针定位,然后等到构造函数本身,其实就是对象实例对应的原型对象
    */
    alert(box1.constructor);

    alert(box1.age);//可以直接访问原型对象中的属性和方法,因为底层会自动调用prototype和__proto__和constructor等属性

  判断一个对象是否指向了该构造函数的原型对象(即判断一个对象实例是不是指向了对象的原型对象)可以使用 isPrototypeOf()方法来测试。

function Box() {} //声明一个构造函数
    Box.prototype.name = ‘Lee‘; //在原型里添加属性
    Box.prototype.age = 100;
    Box.prototype.run = function () { //在原型里添加方法
        return this.name + this.age + ‘运行中...‘;
    };

    var box1 = new Box();
    var box2 = new Box();
    alert(box1.age);//结果打印出age的值
    alert(Box.prototype.isPrototypeOf(box1)); //只要实例化对象,即都会指向

三、原型模式的执行流程

  1、先查找构造函数实例里的属性或方法,如果有,立刻返回;
  2、如果构造函数实例里没有,则去它的原型对象里找,如果有,就返回;

  虽然我们可以通过对象实例访问保存在原型中的值,但却不能通过对象实例重写原型中的值。

  function Box() {} //声明一个构造函数
    Box.prototype.name = ‘Lee‘; //在原型里添加属性
    Box.prototype.age = 100;
    Box.prototype.run = function () { //在原型里添加方法
        return this.name + this.age + ‘运行中...‘;
    };

    var box1 = new Box();
    alert(box1.name); //Lee,原型里的值
    box1.name = ‘Jack‘;
    alert(box1.name); //Jack,就近原则,
    var box2 = new Box();
    alert(box2.name); //Lee,原型里的值,没有被 box1 修改

    如果想要 box1 也能在后面继续访问到原型里的值,可以把构造函数里的属性删除即可,具体如下:

  function Box() {} //声明一个构造函数
    Box.prototype.name = ‘Lee‘; //在原型里添加属性
    Box.prototype.age = 100;
    Box.prototype.run = function () { //在原型里添加方法
        return this.name + this.age + ‘运行中...‘;
    };

    var box1 = new Box();
    alert(box1.name); //Lee,原型里的值
    box1.name = ‘Jack‘;
    alert(box1.name); //Jack,就近原则,

    delete box1.name; //删除实例中属性
    alert(box1.name);
    Box.prototype.name = ‘kkk‘//覆盖原型中name属性的值
    alert(box1.name);//结果是kkk
    delete Box.prototype.name;//删除原型中的属性值,之后结果是undefined
    alert(box1.name);

  如何判断属性是在构造函数的实例里,还是在原型里?可以使用 hasOwnProperty()函数来验证:

  function Box() {} //声明一个构造函数
    Box.prototype.name = ‘Lee‘; //在原型里添加属性
    Box.prototype.age = 100;
    Box.prototype.run = function () { //在原型里添加方法
        return this.name + this.age + ‘运行中...‘;
    };

    var box1 = new Box();
    alert(box1.name); //Lee,原型里的值
    box1.name = ‘Jack‘;
    alert(box1.name); //Jack,就近原则,
    alert(box1.hasOwnProperty(‘name‘));     //判断实例是否存在指定属性   实例里有返回 true,否则返回 false

  

  in操作符会在通过对象能够访问给定属性时返回 true,无论该属性存在于实例中还是原型中。

  function Box() {} //声明一个构造函数
    Box.prototype.name = ‘Lee‘; //在原型里添加属性
    Box.prototype.age = 100;
    Box.prototype.run = function () { //在原型里添加方法
        return this.name + this.age + ‘运行中...‘;
    };

    var box1 = new Box();
    alert(‘name‘ in box1); //true,存在实例中或原型

  我们可以通过hasOwnProperty() 方法检测属性是否存在实例中,也可以通过 in 来判断实例或原型中是否存在属性。那么结合这两种方法,可以判断原型中是否存在属性。

  function Box() {} //声明一个构造函数
    Box.prototype.name = ‘Lee‘; //在原型里添加属性
    Box.prototype.age = 100;
    Box.prototype.run = function () { //在原型里添加方法
        return this.name + this.age + ‘运行中...‘;
    };

    var box1 = new Box();
    alert(box1.hasOwnProperty(‘name‘));
    alert(‘name‘ in box1);
    //如果第一个为false说明实例中没有该属性,而第二个为true说明属性存在原型中
    //如果第一个为true,说明属性存在实例中

  也可以定义一个函数来判段,原理是一样的

  function Box() {} //声明一个构造函数
    Box.prototype.name = ‘Lee‘; //在原型里添加属性
    Box.prototype.age = 100;
    Box.prototype.run = function () { //在原型里添加方法
        return this.name + this.age + ‘运行中...‘;
    };
    function isProperty(object, property) {       //判断原型中是否存在属性
        return !object.hasOwnProperty(property) && (property in object);
    }

    var box1 = new Box();

    alert(isProperty(box1, ‘name‘)) //true,如果原型有
时间: 2024-10-03 09:00:05

JavaScript的原型基础1的相关文章

javascript数组原型方法

1.javascript数组原型方法. 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>jstest</title> 6 </head> 7 <body> 8 <script> 9 var arr = ["1","2&q

JavaScript的原型继承

JavaScript是一门面向对象的语言.在JavaScript中有一句很经典的话,万物皆对象.既然是面向对象的,那就有面向对象的三大特征:封装.继承.多态.这里讲的是JavaScript的继承,其他两个容后再讲. JavaScript的继承和C++的继承不大一样,C++的继承是基于类的,而JavaScript的继承是基于原型的. 现在问题来了. 原型是什么? 原型我们可以参照C++里的类,同样的保存了对象的属性和方法.例如我们写一个简单的对象 function Animal(name) { t

Javascript之原型(二) - Zhouqin的博客

#Javascript之原型(二)许多oo语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所示,由于函数没有签名,在ECMAScript中无法实现接口继承.而ECMAScript中只支持实现继承,而且实现继承主要是依靠原型链来实现的. ###原型链 以上定义了两个类型:SuperType和SubType.每个类型分别有一个属性和方法.SubType继承了SuperType,而继承是通过创建SuperType的实例,并将该实例赋给SubTyoe.

【javascript】ajax 基础 --本文转载

[javascript]ajax 基础 什么是 ajax ajax 即"Asynchronous JavaScript and XML"(异步 JavaScript 和 XML),也就是无刷新数据读取. http 请求 首先需要了解 http 请求的方法(GET 和 POST). GET 用于获取数据.GET 是在 URL 中传递数据,它的安全性低,容量低. POST 用于上传数据.POST 安全性一般,容量几乎无限. ajax 请求 ajax 请求一般分成 4 个步骤. 1.创建 a

javascript简单原型

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getS

史上最清晰的JavaScript的原型讲解

一说起JavaScript就要谈的几个问题,原型就是其中的一个.说了句大话,史上最清晰.本来是想按照大纲式的行文写一下,但写到后边感觉其实就一个概念,没有什么条理性,所以下面就简单按照概念解释的模式谈下这个问题. 1.JavaScript的原型是什么? 原型,首先他是个对象.和在以对象为核心的JavaScript这门语言中的其他普通对象来说一样,只不过他的角色有点特殊.但首先要明白他就是一个对象,是一个无序的属性和值的序列对. 2.谁会具有原型这个对象? 所有的对象(包括函数这个对象)在默认的情

深刻理解JavaScript基于原型的面向对象

主题一.原型 一.基于原型的语言的特点 1 只有对象,没有类;对象继承对象,而不是类继承类. 2  "原型对象"是基于原型语言的核心概念.原型对象是新对象的模板,它将自身的属性共享给新对象.一个对象不但可以享有自己创建时和运行时定义的属性,而且可以享有原型对象的属性. 3 除了语言原生的顶级对象,每一个对象都有自己的原型对象,所有对象构成一个树状的层级系统.root节点的顶层对象是一个语言原生的对象,其他所有对象都直接或间接继承它的属性. 显然,基于原型的语言比基于类的语言简单得多,我

理解JavaScript 的原型属性

1.原型继承 面向对象编程可以通过很多途径实现.其他的语言,比如 Java,使用基于类的模型实现: 类及对象实例区别对待.但在 JavaScript 中没有类的概念,取而代之的是一切皆对象.JavaScript 中的继承通过原型继承实现:一个对象直接从另一对象继承.对象中包含其继承体系中祖先的引用——对象的 prototype 属性. 2. JavaScript 实现继承的语言特性 当尝试访问 JavaScript 对象中不存在的属性时,解析器会查找匹配的对象原型.例如调用 car.toStri

【JavaScript】02.基础语法学习

[JavaScript]02.基础语法学习 引言: 老农认为(老农是我对自己的昵称),学习任何一门计算机程序语言都要先从它的语法知识开始.计算机程序语言由一堆预定义的字符和书写这些字符的规则组成.这些预定义的字符在语言里面叫做关键字或者保留字,书写这些字符的规则叫做语法. 计算机语言(Computer Lnguage),是指用于人与计算机之间通讯的语言.语言分为自然语言与人工语言两大类.自然语言是人类在自身发展的过程中形成的语言,是人与人之间传递信息的媒介.人工语言指的是人们为了某种目的而自行设