简述prototype:

在js中,每个构造函数都有一个原型属性prototype,因为这个属性的值通常是一个对象,又叫原型对象!你不需要显式的去定义原型对象,因为每个构造函数都会一个原型属性,通常在这个原型对象中,会包含一个constructor属性指向该原型对象的构造函数:

function a() {
    alert('hello');
} var b = new a();
console.log(b.constructor);//返回函数a的字面量function a() {alert('hello')} ;

以上代码中你会发现,首先你并没有定义函数a的prototype,以及constructor;但是在使用的时候构造函数a的实例对象b的constructor属性却正确的指向构造函数a;

我们都知道js是一种基于原型继承的语言,这里说的原型指的就是对象的原型属性!从这就能看出来,在js中,原型是用来实现继承的!那么为什么可以通过对象的原型就能实现继承了?这是因为在js中,所有使用同一个构造函数生成的实例对象,都共享该构造函数的原型对象,例如:

//定义构造函数
function user(name, age) {
    this.name = name;
    this.age = age;
} //定义构造函数user的原型方法
user.prototype.getName = function() {
    alert(this.name);
}
user.prototype.getAge = function() {
    alert(this.age);
} //生成实例
var userA = new user('a', '22');
var userB = new user('b', '30');
userA.getName();//a
userA.getAge();//22
userB.getName();//b
userB.getAge();//30

由以上代码可以看出,在构造函数中我们并没有定义获取名称和获取年龄的方法getName以及getAge;它们是在原型对象中定义的;但是我们在底下代码中的user构造函数的两个实例对象userA和userB却都可以使用构造函数的原型对象中的方法!这就是上面说的:所有使用同一个构造函数生成的实例对象,都共享该构造函数的原型对象!

prototype中的constructor属性:

上面简单的介绍了一下prototype中的constructor属性,该属性是原型对象中自带的属性,并且它始终是指向该原型的构造函数的!

//定义构造函数
function user(name, age) {
    this.name = name;
    this.age = age;
} //定义构造函数user的原型方法
user.prototype.getName = function() {
    alert(this.name);
}
user.prototype.getAge = function() {
    alert(this.age);
} //生成实例
var userA = new user('a', '22');
var userB = new user('b', '30');
console.log(userA.constructor === userB.constructor)//true;

当然,我们也可以动态的设置constructor属性的值:

user.prototype.constructor = user;

只是在我们没有重新定义覆盖prototype对象的时候,并不需要这样显示的去让constructor属性指向构造函数!

覆盖prototype对象:

上面我们简单介绍了prototype对象,并且也给出来一些简单使用的例子,在上面的例子中,我们都是往构造函数的prototype对象上添加方法或属性的,有一个方法我们就要添加一次,这样显的不够优雅,那么有没有一种写法是可以一次定义这些方法的了?答案当然是肯定的,这就是我们下面要讲的覆盖prototype对象,我们先来看看怎么做,下面我们重写上面的例子:

//定义构造函数
function user(name, age) {
    this.name = name;
    this.age = age;
}
//定义构造函数user的原型方法
user.prototype = {
    constructor : user,
    getName : function() {
        alert(this.name);
    },
    getAge : function() {
        alert(this.age);
    }

大家可以复制上面的代码,看看效果是不是跟之前的效果一样!相信大家看了代码之后应该也都明白了,既然prototype是一个对象,那么我们当然能重新定义一个对象去覆盖它了,但是这里值得注意的是,在原型对象中,默认是包含constructor属性指向构造函数的,在我们自己定义对象覆盖prototype对象时,要显式的定义constructor属性指向构造函数,否则,这个prototype对象的constructor属性就会是undefined!

结:

说到这里,关于prototype对象的一些知识以及基本用法,已经跟大家交代清楚了,因为js是基于原型继承的,所以了解prototype对象的相关对象,对于js面向对象编程是至关重要的!关于prototype的部分我们就先讲到这里,等以后有时间,我们在接着讲原型链,面向对象以及js中的继承等知识!

感谢大家的阅读,本文由平凡公子原创发布,转载请注明出处,谢谢!

JavaScript之prototype对象的更多相关文章

  1. [前端JS学习笔记]JavaScript prototype 对象

    一.概念介绍 prototype 对象 : 原型对象.在JavaScript中, 每一个对象都继承了另一个对象,后者称为"原型对象". 只有 null 除外,它没有自己的原型对象. ...

  2. [原创]javascript prototype 对象 函数 <精简的美丽......>

    精简的美丽...... javascript prototype 对象 函数 在javascript中我们都知道创建一个对象使用如下代码var x = {}对象可以拥有属性和方法var x = {   ...

  3. javascript 原型(prototype 、__proto__、函数、对象)

    一.类型 1.JavaScript中分为值类型(string/boolean/null/number/undefind).引用类型(数组.对象.函数): 2.数组.函数.对象都是对象: 对象是由函数创 ...

  4. 浅谈系列之 javascript原型与对象

    在我学习与使用javascript三个月中,我一直对javascript的继承关系以及prototype理解不清,导致很多时候为什么这么用说不出个所以然来.截止到本周为止,通过之前的学习以及自己的再学 ...

  5. javascript是判断对象是否是数组

    JS中的数据类型: 2大类 原始类型:值保存在变量本地的数据类型 5种:Number String Boolean undefined null Number:8bytes 舍入误差-->四舍五 ...

  6. Javascript中prototype属性详解

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  7. JavaScript 基础回顾——对象

    JavaScript是基于对象的解释性语言,全部数据都是对象.在 JavaScript 中并没有 class 的概念,但是可以通过对象和类的模拟来实现面向对象编程. 1.对象 在JavaScript中 ...

  8. javascript中的对象,原型,原型链和面向对象

    一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...

  9. javascript 之 prototype继承机制

    理解Javascript语言的继承机制 javascript没有"子类"和"父类"的概念,也没有"类"(class)和"实例&qu ...

随机推荐

  1. JVM知识点总览-中高级Java工程师面试必备

    对于搞开发的我们其实也是一样,现在流行的框架越来越多,封装的也越来越完善,各种框架可以搞定一切,几乎不用关注底层的实现,初级程序员只要熟悉基本的使用方法,便可以快速的开发上线:但对于高级程序员来讲,内 ...

  2. Java加密和C#解密=>DES方法

    Java加密代码: import javax.crypto.*; import javax.crypto.*; import java.io.UnsupportedEncodingException; ...

  3. tooltips插件

    摘要: 继‘带箭头提示框’,本文将分享几款带箭头提示框. qtipqTip是一种先进的提示插件,基于jQuery框架.以用户友好,而且功能丰富,qTip为您提供不一般的功能,如圆角和语音气泡提示,并且 ...

  4. 【Oracle】两个表Join关联更新

    两个表关联,用B表的字段更新A表的字段. UPDATE ( SELECT A.COL1 A_COL, B.COL2 B_COL FROM table1 A INNER JOIN table2 B ON ...

  5. 【Leaflet】鼠标提取坐标

    map.on('mousemove', function (e) { document.getElementById('info').innerHTML = /* innerHTML 属性设置或返回表 ...

  6. PostgreSQL存储过程(5)-异常错误处理

    1. 异常错误处理 在PL/pgSQL函数中,如果没有异常捕获,函数会在发生错误时直接退出,与其相关的事物也会随之回滚.我们可以通过使用带有EXCEPTION子句的BEGIN块来捕获异常并使其从中恢复 ...

  7. wordpress for sae

    帮人建个站,准备用sae+wordpess,小研究一下 http://sae.sina.com.cn/?m=apps&a=detail&aid=1 http://wp4sae.org/ ...

  8. Spring Web 应用的最大败笔

    开发人员在使用Spring应用是非常擅长谈论依赖注入的好处.不幸的是,他们不是那么真的利用它的好处,如单一职责原则,分离关注原则.如果我们一起来看看大部分Spring的Web应用程序,常见的错误的设计 ...

  9. C语言中如何计算时间差

    #include <time.h>   #include <stdio.h>   int main()   {       time_t start ,end ;        ...

  10. 初步总结javascript中学习DOM之前的知识

    嘿嘿,又到了周末时间,周六其实就是总结这周的学习的,记得周二周三刚开始接触javascript时间,还是不知道怎么学习的,就感觉找不到方向,那时间学习的只是总结了一些简单的定义或者是学习结构,今天就把 ...