原型,原型对象,原型链,构造函数,继承(一)

前言:javascript中 万物皆对象 , 但是对象是有区别的 分为普通对象(object)和函数对象(function):

  ①由以下三种形式创建的对象为函数对象:

    function fun1(){}
    var fun2 = function(){}
    var fun3 = new Function();
    console.log(typeof fun1);//function
    console.log(typeof fun2);//function
    console.log(typeof fun3);//function           

  ②其余创建的对象都为普通对象;

  ③Object , Function , Array , Map , Date ......等js中的内置对象都是通过new Function()创造的 , 所以:

    console.log(typeof Function);//function
    console.log(typeof Object);//function
    console.log(typeof Array);//function
    console.log(typeof Map);//function

  ④在js中 ,每当定义一个对象 , 都会包含一些预定的属性 , 其中函数对象就有一个属性叫prototype

  ⑤普通对象没有prototype属性 ,  但是有__proto__属性

  ⑥prototype(原型对象)就是普通对象 , 除了Function.prototype(function)

    log(typeof obj1.__proto__);//object    console.log(typeof fun1.prototype);//object
    console.log(typeof fun1.prototype.__proto__);//object
    console.log(typeof Object.prototype);//object
    console.log(typeof Function.prototype);//function

一.什么是__proto__(原型):

  每个对象都有__proto__属性 , __proto__指向创建他的构造函数的原型对象(实例指向原型对象的指针).

二.什么是prototype(原型对象):

  每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和方法。原型是一个对象,其他对象可以通过它实现继承。

  作用:主要用来继承,实现继承靠的是原型链

     如果构造函数和构造函数的原型对象都有同一个方法 , 那么对优先继承构造函数的 , 在js底层 , 一般都是给父构造函数的原型对象添加方法 .

     var Student = function(){
            this.name = ‘lily‘;
        }
        Student.prototype.name = function(){
            return "mike";
        }
        var stu = new Student();
        console.log(stu.name); //‘lily‘     
     //__proto__属性是实例指向原型对象的指针 , 以下是原型链表示代码     console.log(stu.__proto__ === Student.prototype);//true
        console.log(Student.prototype.__proto__ === Object.prototype);//true
        console.log(Object.prototype.__proto__ === null);//true    

      console.log(Student.__proto__ === Function.prototype);
      console.log(Object.__proto__ === Function.prototype);
      console.log(Function.__proto__ === Function.prototype);
      console.log(Function.prototype.__proto__ === Object.prototype);
      console.log(Object.prototype.__proto__ === null);

三.原型链:

  原型链总结:

  1.继承的实现并不是靠prototype,而是靠__proto__
  2.原型链的作用,在于读取对象的某个属性时,js引擎会优先查找对象本身的属性,如果没有,会去该对象的构造函数的原型对象(prototype)上面找,一直找到最顶层的原型对象,Object.prototype , 如果还没有则返回undefine
  3.这个过程中,维持上下层关系靠的是__proto__

 

时间: 2024-10-12 02:52:34

原型,原型对象,原型链,构造函数,继承(一)的相关文章

原型,原型对象,原型链,构造函数,继承(二)

1.prototype(原型对象)有一个属性叫做constructor,constructor默认指向prototype(原型对象)所在的构造函数 2.constructor属性是定义在prototype上的,那就意味着可以被实例对象所继承 3.可以使用hasOwnProperty 方法来验证一个属性是自己的还是继承过来的 4.constructor的作用: 作用一:分辨原型对象到底属于哪个构造函数 instanceof() 作用二:可以从一个实例对象创建另一个实例对象 var Fun = fu

[js高手之路]一步步图解javascript的原型(prototype)对象,原型链

我们接着上文继续,我们通过原型方式,解决了多个实例的方法共享问题,接下来,我们就来搞清楚原型(prototype),原型链的来龙去脉. function CreateObj(uName) {             this.userName = uName;         }         CreateObj.prototype.showUserName = function(){             return this.userName;         }         va

关于对象、构造函数、原型、原型链、继承

对象: 在传统的面向过程的程序设计中,会造成函数或变量的冗余.而js中对象的目的是将所有的具有相同属性或行为的代码整合到一起,形成一个集合,这样就会方便管理,例如: var person1={ name:"memphis", age:26, showMessage:function(){ alert("name:"+this.name); } }; person1.showMessage();//输出name:memphis 以上的例子将name.age.showM

Js中的对象、构造函数、原型、原型链及继承

1.对象 在传统的面向过程的程序设计中,会造成函数或变量的冗余.而JS中对象的目的是将所有的具有相同属性或行为的代码整合到一起,形成一个集合,这样就会方便我们管理,例如: var person1={    name:"tan",    age:26,    showMessage:function(){        alert("name:"+this.name);    }};person.showMessage();//输出name:tan 以上的例子将nam

JavaScript构造函数+原型创建对象,原型链+借用构造函数模式继承父类练习

虽然经常说是做前端开发的,但常常使用的技术反而是JQuery比较多一点.在JavaScript的使用上相对而言少些.尤其是在创建对象使用原型链继承上面,在项目开发中很少用到.所以今天做个demo练习一下,以后忘记了也可以照搬一下. 说明一下: 1. Demo中使用的是构造函数+原型模式创建的对象.构造函数中存储对象实例使用的属性,原型模式增加实例使用的方法. 2. Demo中的继承分为两个方面.一个是属性继承,使用的是借用构造函数模式 call()方法.另一个是方法继承,这个就是使用原型方式继承

JS中面向对象的,对象理解、构造函数、原型、原型链

6.1 理解对象 6.1.1 对象属性类型 ECMS属性有两种类型:数据属性和访问器属性 1 数据属性 [[configurable]] 表示能否通过Delete 删除属性从而从新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性.对象上定义的属性默认值为true [[enumerable]] 表示能否通过for-in循环返回属性.直接在对象上定义的属性,它们的这个特性默认值为true [[writable]] 表示能否修改属性值.像前面例子中那样直接在对象上定义的属性,它们默认值为t

JS创建对象模式及其对象原型链探究(五):组合使用构造函数模式和原型模式

组合使用构造函数模式和原型模式 构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性. 创建自定义类型的最常见方式,就是组合使用构造函数模式和原型模式. 1.创建对象 // 组合使用构造函数模式和原型模式 function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.friend = ["Jenny", "Court"]; } Person.p

原型链的继承都发生在构造函数上

网上的一道题目:var M = function() { this.person = "life" }, N = function() { this.gate = "ok" }; var k = new M(), l = new N(); k.__proto__ = l; console.log(k.gate); 这么写是有问题的. _proto_和prototype的区别. 首先应该是 k.prototype ...原型链的继承都是基本都是发生在构造函数上的,所以

算法-javascript自实现继承extend(单次继承原型对象和单次继承构造函数)

# 自实现继承(单次继承构造函数)  //父类的构造函数   function Father(name,age){    this.name=name    this.age=age   }      //父类的原型对象   Father.prototype={    constructor:Father,    say:function(){     console.log('i am '+this.name+' ,'+this.age+' years old')    }   }