JavaScript原型,原型链 ? Js的继承?

什么是js原型:函数的一个属性,在函数的创建过程中由js编译器自动添加。具体来说,就是我们经常使用的,prototype属性,这个属性怎么得来的呢?

当生产一个function对象的时候,就可以看到它了。

js functiion对象的创建-1

要使用function对象,必须先创建一个对象,有几种方式:

1、var A = function(){};//字面量,匿名函数,推荐

2、function A(){};//函数声明

3、var A = new Function(//这里是函数体)//实例化函数对象

那么,我们来看第一种方式做了什么

分解动作:

1、x = new Object();//开辟一块内存,然后创造一个对象

2、x.constructor = A;//将x的构造函数指向A的函数实体

3、A.prototype = x;//A的原型指向新开辟的对象

js function对象的创建-2

几点说明:

1、每创建一个function的对象,会自动为其增加一个“name”的属性,采用方法1,name= undefined,方法二才会有值。

2、_proto_属性是隐性属性,除了FF以外,没有方法调用到。

3、每次new一个function其实消耗的空间是如上图所示的,其实创建的是两个对象。

js 里面的构造函数

只要是个函数,他就可以使构造函数,他具有函数的功能,也能够返回值,不过这里要特别注意,如果构造函数返回基本类型的值,这个值会被忽略,如果

构造函数返回一个对象,OK,你悲剧了,如下图

实例属性和静态属性(原型方法)、类属性-1

这几个概念在js里面并不是很明晰,在强类型语言里面,多使用static来做标识。

我们来看以下代码:

var A  = function(){//this is a class

this.instanceProp = 1;//this is a instance,chrome will no show when undefined

this.instanceFunction = function(){};//this is a instance function

}

A.prototype.staticFn = function(){}//this is a static function

A.classFn = function(){}//this is a class function

//实例化代码

var a = new A();

实例属性和静态属性(原型方法)、类属性-2

分解动作

//实例化A类,此时,第一步,将构建一个空的object

//第二步将执行,a._proto_= A.prototype

//第三步将执行构造函数,将实例化方法返回到当前实例上,也就是A.apply(a,[args]);

//第四步是修正构造函数指向,a._pro_.constructor =A;

//也就是说,var a  = new A();分解为:

var a = new Object();

a._pro_=A.prototype;

A.call(a);

a._proto_.constructor = A;

实例属性和静态属性(原型方法)、类属性-3

上面一步的内存结构为,大家注意消化下内存中的引用关系

原型(链)继承

那么当我们使用原型链继承的时候发生了什么?

一般我们的原型链继承,我们这么写:

var B =function(){

this.bslnsProp = "xx";

};

B.prototype = new A();

直接看内存模型吧

时间: 2024-10-28 14:16:08

JavaScript原型,原型链 ? Js的继承?的相关文章

【深入JavaScript】一种JS的继承方法

这些天读了John Resig的<Secrets of JavaScript Ninja>,其中讨论到JS中实现继承的方案,非常有趣,自己探索了一下,形成了笔记,放到这里. 这个方案在Resig的博客上也有,虽然代码略微有点不一致,但核心思想是一样的,请戳 这里 . <html> <head> <title></title> </head> <body> <script type="text/javascr

[js高手之路]从原型链开始图解继承到组合继承的产生

于javascript原型链的层层递进查找规则,以及原型对象(prototype)的共享特性,实现继承是非常简单的事情 一.把父类的实例对象赋给子类的原型对象(prototype),可以实现继承 1 function Person(){ 2 this.userName = 'ghostwu'; 3 } 4 Person.prototype.showUserName = function(){ 5 return this.userName; 6 } 7 function Teacher (){}

明白JavaScript原型链和JavaScrip继承

原型链是JavaScript的基础性内容之一.其本质是JavaScript内部的设计逻辑. 首先看一组代码: 1 <script type="text/javascript"> 2 function parent(){ 3 this.name="cehis"; 4 } 5 6 function son(){ 7 this.age=11; 8 } 9 10 function sub(){ 11 this.sex="nan"; 12 }

javascript精髓篇之原型链维护和继承.

一.两个原型 很多人都知道javascript是原型继承,每个构造函数都有一个prototype成员,通过它就可以把javascript的继承演义的美轮美奂了.其实啊,光靠这一个属性是无法完成javascript的继承.我们在代码中使用的prototype完成继承在这里就不多说了.大家可以查一下资料.另外一个看不见的prototype成员.每一个实例都有有一条指向原型的prototype属性,这个属性是无法被访问到的,当然也就无法被修改了,因为这是维护javascript继承的基础. 1 //构

node.js javascript理解原型继承

util.inherits util.inherits(constructor, superConstructor)是一个实现对象间原型继承的函数. JavaScript 的面向对象特性是基于原型的,与常见的基于类的不同.JavaScript 没有提供对象继承的语言级别特性,而是通过原型复制来实现的 var util = require('util'); function Base() { this.name = 'base'; this.base = 1991; this.sayHello =

JavaScript ES5类 原型 原型链 组合、原型、寄生式继承

ES5类 原型  原型链 继承 JavaScript中,原型是相对于构造函数(类)的叫法(或者说概念),原型链是相对于构造函数(类)的实例对象的叫法. 对于JavaScript对象,如果在对象自身上找不到该属性,那么就会向上沿着原型链继续查找该属性 创建一个ES5类 在ES5中,类是由函数名首字母大写的函数,通过关键字new创建的. 类的构造函数就是函数自身 一般情况下,ES5类的原型对象prototype是自身构造函数,该类的实例化对象的原型链对象__proto__也是该构造函数,这二者指向同

08.22 javaScript 原型的定义 原型链 获取原型 操作原型的属性 判断原型是自有的还是继承的 各种方法

# 原型 ### 定义 * 每一个对象都有原型 * 原型仍然是一个对象 * 模拟实现面向对象的继承性 ### 原型链 * 对象的原型还有原型 * 对象除了可以使用自有属性还可以继承原型上的属性 ### 获取原型 * 对象.__proto__ * 构造函数.prototype ### 操作原型的属性 * 原型本身就是对象,同操作对象 ### 判断属性是自有的还是原型继承的 * hasOwnProperty() ### ECMA5中创建对象并指定对象的原型 * Object.create(); #

js(4) 继承与原型链

一:使用原型链来实现继承 在介绍原型链之前,要引入构造函数,原型,和实例的关系 构造函数都有一个原型对象,在原型对象中存在一个指向构造函数的指针(constructor),在实例中包含一个指向原型对象的内部指针(prototype) 构建原型链的原理是让一个类型的原型对象等于另一个类型的实例 当使用new 操作符构造实例的时候,实例会拥有构造函数原型中的属性和方法 实现代码如下: function SuperType(){ this.property=true; }//在SuperType的原型

关于JavaScript的原型继承与原型链

在讨论原型继承之前,先回顾一下关于创建自定义类型的方式,这里推荐将构造函数和原型模式组合使用,通过构造函数来定义实例自己的属性,再通过原型来定义公共的方法和属性. 这样一来,每个实例都有自己的实例属性副本,又能共享同一个方法,这样的好处就是可以极大的节省内存空间.同时还可以向构造函数传递参数,十分的方便. 这里还要再讲一下两种特色的构造函数模式: 1.寄生构造函数从形式上来看,这种模式和工厂模式并无区别: function Person(name, age, job){var o = new O