简述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. 未定义变量 "caffe" 或类 "caffe.reset_all"

    配置caffe后在matlab中测试报错. 未定义变量 "caffe" 或类 "caffe.reset_all". 我的原因是:caffe在matlab接口处没 ...

  2. kettle教程二

    转载:http://www.cnblogs.com/limengqiang/archive/2013/01/16/KettleApply2.html 1.应用场景 这里简单概括一下几种具体的应用场景, ...

  3. ios开发之--搜索框的使用(PYSearchViewController的使用)

    最近需要开发搜索框,比较了以前的各个版本的搜索框,UISearchDisplayController和UISearchController的使用,以后再做记录,随着ios11的更新,一些控件发生了,改 ...

  4. [Python]小百合十大爬虫

    国庆几天在家看了几篇关于使用Python来编写网络爬虫的博客,想来自己断断续续学习Python也有几个月了,但一个像样的程序都没有写过,编程能力并没有得到提高,愧对自己花费的时间.很多时候虽然知道什么 ...

  5. Unity读取配置文件

    config.ini存放在Assets目录下,项目打包之后存放在Data目录下exe同目录 // 从配置文件读取 string configFile = Application.dataPath + ...

  6. [C] include <filename> 和 include "filename" 的区别

    在 C 语言中包含语句 #include <filename> 和 #include "filename" 的区别在于编译器的偏好,一般来说,使用双引号表示优先搜索当前 ...

  7. Mac终端解压命令集合

    tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— .gz 解压1 ...

  8. date 类型转为varchar

    select t.type_id as typeId, t.type_name as typeName, t.type_order as typeOrder, t.type_link as typeL ...

  9. creat-react-app 如何在组件中img的src引入图片路径??

    把图片文件夹放到public中,然后以这种方式来动态写路径: process.env.PUBLIC_URL + '/img/' + url + '.jpg'

  10. nsi脚本中执行.bat文件要隐藏dos窗口问题

    问题原因:工作中,在一个nsi的安装脚本文件中需要安装虚拟摄像头驱动,安装驱动脚本是.bat文件.使用nsi的execwait函数执行.bat文件时会显示dos窗口.但是领导要求不能显示dos窗口. ...