构造函数、原型对象、继承

构造函数

构造函数就是我们用new创建对象时调用的函数。到目前为止,我们已经学过好多内置的构造函数了,例如,Object,Array和Function。使用同一个构造函数创建的对象都具有相同的属性和方法。除了这些内置的构造函数外,我们也可以创建自己的构造函数。

构造函数也是函数,和普通函数的定义方式一样。唯一的区别是构造函数名的首字母应该大写,以此区分于其他函数。下面定义了一个空的Person函数。

function Person() {

}

定义好构造函数以后,你就可以用它来创建对象了,例如,下面使用Person构造函数创建了2个对象。

var person1 = new Person();
var person2 = new Person();

当我们使用 new 操作符调用函数时,函数内部会自动创建一个该类型的新对象。当函数调用完成时,该对象会被自动的返回到函数外部。我们可以使用 instanceof 操作符检查 person1 和 person2 是否是 Person 类型的对象实例:

console.log(person1 instanceof Person);  // true
console.log(person2 instanceof Person);  // true

由于person1和person2是通过Person构造函数创建的,因此使用instanceof操作符检查它们是否为Person类型的实例时返回true。

声明一个空的构造函数其实没有什么用。使用构造函数的目的是为了轻松创建许多拥有相同属性和方法的对象。我们可以在函数内部通过 this 关键字使用新创建的对象,如下例:

function Person(name) {
    this.myName = name;
    this.sayName = function() {
        console.log(this.myName);
    }
}

每个对象都有自己的myName属性,所以sayName()方法可以根据不同对象返回不同的值。

原型对象

prototype属性

一个对象实例通过内部属性 __proto__ 跟踪其原型对象。该属性的值是一个内存地址(指针),指向该实例使用(继承)的原型对象。当我们使用 new 创建一个新的对象时,构造函数的prototype对象会被赋值给新对象的__proto__属性。下图描绘了__proto__属性的指向:

原型对象链

由于原型对象也是一个对象,它也有自己的原型对象并继承原型对象中的属性。这就是原型对象链:对象继承其原型对象,而原型对象继承它的原型对象,依此类推。

当读取一个对象的属性时,JavaScript引擎首先在该对象的自有属性中查找属性名字。如果找到则返回。如果自有属性中不包含该属性,则JavaScript会沿着原型对象链搜索原型对象中的属性。如果找到则返回,否则返回undefined。

继承

学习如何创建对象是理解面向对象编程的第一步。第二步是理解继承。在传统的面向对象语言中,类从其他类继承属性。然而在JS中,在没有类的情况下,继承可以发生在对象之间。这种继承的机制你已经熟悉了,就是继承原型对象中属性。

原型对象继承

JS内置的继承方式被称为原型对象链继承,又可称为原型对象继承。就像我们前面讲的那样,原型对象的属性可以被对象实例访问,这就是继承的一种形式。对象实例继承了原型对象中的属性。

所有对象,包括那些我们通过自定义构造函数创建的对象都自动继承自Object,除非我们另有指定。更确切地说,所有对象都继承自Object.prototype。任何以Object的字面量形式创建的对象,其__proto__属性的值都被自动设置为Object.prototype,这意味着它继承Object.prototype的属性。

修改Object.prototype

所有对象都会继承Object.prototype对象的属性和方法。如下例所示,给Object.prototype添加方法:

Object.prototype.add = function (value) {
    return this + value;
};

添加到Object.prototype对象上的属性会被所有类型的对象所继承,有些时候这样写是没有意义的,并且还可能会出错。不要轻易修改Object.prototype对象。

对象继承

对象继承是最简单的继承方式。我们唯一需要做的就是指定哪一个对象是新对象的原型对象。对象字面量形式会隐式指定Object.prototype为其原型对象,我们也可以使用Object.create()方法显式指定原型对象。

Object.create()方法接受两个参数。第一个参数是需要被设置为新对象的原型对象。第二个参数是选的,用来为新对象添加属性。

两种声明具有相同的效果,第一种声明使用对象字面量形式来定义一个具有单一属性title的对象。该对象自动继承自Object.prototype,且其属性被默认设置为可配置、可枚举和可写。第二种声明使用Object.create()方法显式做了同样的操作。两个book对象的行为完全一致。但这样写没啥意义,使用字面量定义的对象默认就继承Object.prototype,因此我们没有必要这样写。继承自其他对象则更有趣。

原文地址:https://www.cnblogs.com/zhengedeboke/p/12076216.html

时间: 2024-10-07 10:16:06

构造函数、原型对象、继承的相关文章

MDN——javascript——入门——第三章对象——对象.构造函数.原型链.继承——知识点总结

对象Object 由属性property(变量).方法method(函数)组成 var objectName = { member1Name : member1Value, member2Name : member2Value, member3Name : member3Value } member(成员)的值是任意的, 一个如上所示的对象被称之为对象的字面量(literal)——手动的写出对象的内容来创建一个对象.不同于从类实例化一个对象,我们会在后面学习这种方式. 访问对象成员 1.点表示法

面向对象中构造函数,原型对象和实例的关系图

总结 以下代码为例 function Person(){} Person.prototype.c=function(){} var p1=new Person(); var p2=new Person(); 1.构造函数有一个prototype属性,(任何函数都有这个属性)这个属性表示原型对象 Person.prototype 2.构造函数的原型对象有个consturctor属性,指向构造函数本身 Person.prototype.constructor===Person 3.构造函数的原型对象

读书笔记--对象、实例、原型、继承

创建对象的设计模式 工厂模式 抽象了创建具体对象的过程,用函数封装以特定接口创建对象的细节 解决了创建多个相似对象的问题,没有解决对象识别的问题 function createPerson(name,age){ var obj = new Object(); obj.name = name; obj.age = age; obj.sayName = function(){ alert(this.name) } return obj; } var person = createPerson('aa

构造函数、原型和继承

element.insertAdjacentHTML(position, text): 可以读取字符串里面的标签 创建对象方式 字面量创建 构造函数 new Object() 自定义构造函数 1.构造函数和原型 声明式函数的使用方式不同决定其为构造函数还是普通函数 通过 new 来使用的声明式函数式构造函数 new在执行时做的四件事 在内存中创建一个新的空对象. 让this指向这个新的对象. 执行构造函数里面的代码,给这个新对象添加属性和方法. 返回这个新对象(所以构造函数里面不需要return

232 constructor构造函数,构造函数、实例、原型对象的三角关系

1.6 constructor构造函数 对象原型( __proto__)和构造函数原型对象(prototype)里面都有一个属性 constructor 属性 ,constructor 我们称为构造函数,因为`它指回构造函数本身`. `constructor 主要用于记录该对象引用于哪个构造函数,它可以让原型对象重新指向原来的构造函数`. 一般情况下,对象的方法都在构造函数的原型对象中设置.如果有多个对象的方法,我们可以给原型对象采取对象形式赋值,但是这样就会覆盖构造函数原型对象原来的内容,这样

JavaScript原型对象的属性和方法

前面介绍了普通对象的原型链结构,下面会先介绍一下原型对象中的属性和方法,然后介绍函数对象的原型链,最后将原型链进行整合一下. 第一部分Object.prototype的属性和方法 1 Object.prototype.toString方法 因为Object.prototype顶级对象中定义了toString方法,所以任何对象都有一个toString方法. 可以用来检测对象的类型,当然只能检测内置对象的类型,如果是自定义构造函数创建的对象的话无法准确检测出来类型. 使用方式:Object.prot

javascript中的对象继承关系

相信每个学习过其他语言的同学再去学习JavaScript时就会感觉到诸多的不适应, 这真是一个颠覆我们以前的编程思想的一门语言,先不要说它的各种数据类型以及表达 式的不同了,最让我们头疼,恐怕就是面向对象的部分了,在JavaScript中,是没有给定一 个创建对象的关键词的,它不像Java中一个class就可以创建一个对象,在JavaScript中, 对象是一个十分松散的的key-value对的组合,通常,我们在创建对象时,可以通过{}来直 接生成一个对象,就像我们之前所学的,对象中有属性,有行

8条规则图解JavaScript原型链继承原理

原形链是JS难点之一,而且很多书都喜欢用一大堆的文字解释给你听什么什么是原型链,就算有图配上讲解,有的图也是点到为止,很难让人不产生疑惑. 我们先来看一段程序,友情提示sublimeText看更爽: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edg

人人都能懂的原型对象

提到JS中的对象,我们就不得不提JS对象中的原型.我们知道,JS是可以面向对象编程的语言,通常在面向对象中,继承关系都是通过类来实现的.但是,请记住,在JS中,并没有类的概念.在JS的设计之初就没有类,那么在JS中,继承是通过什么来实现的呢?答案就是原型. 每一个构造函数都有一个与之相关联的对象,该对象称之为原型对象.每个实例对象都能共享其原型对象上的属性和方法.原型对象的作用主要用来实现属性的继承,让实例对象能共享原型对象的属性,减少内存分配.所以,在上一节中,我们想在每个Person对象中共