Javascript:原型模式类继承

原型模式

每个函数(准确说不是类、对象)都有一个prototype属性,这个属性是一个指针,指向一个对象。

使用原型对象的好处是可以让所有对象实例共享它包含的属性和方法。

1.原型对象

(1)当创建一个新函数,就会为该函数创建一个prototype属性,这个属性指向函数的原型对象。

(2)默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向 prototype属性所在函数  的指针。

(3)实例的内部包含一个指针,叫[[Prototype]]。不过这个指针对脚本则完全不可见(某些浏览器支持一种__proto__来访问)。

2.代码读取属性顺序

首先搜索对象实例本身,没有则继续搜索指针指向的原型对象。

例:

function Person(){

}

Person.prototype.name="Javascript";

var p1 = new Person();

var p2 = new Person();

p1.name="lufeng";

alert(p1.name);//"lufeng"

alert(p2.name);//"Javascript"

使用delete操作符可以完全删除实例属性。

isPrototypeOf():确定对象之间是否存在prototype关系

hasOwnProperty():检测一个属性是存在于实例中,还是存在原型中。

Object.keys()、Object.getOwnPropertyNames():接收一个对象作为参数,返回

一个包含所有可枚举属性的字符串数组。

来看个很蛋疼的类继承(某个HTML5游戏框架):

inherit : function(childClass, parentClass) {

var Constructor = new Function();

Constructor.prototype = parentClass.prototype;

childClass.prototype = new Constructor();

childClass.prototype.constructor = childClass;

childClass.superclass = parentClass.prototype;

if(childClass.prototype.constructor == Object.prototype.constructor) {

childClass.prototype.constructor = parentClass;

}

}

感觉代码看来比较乱,我画了个图:

时间: 2024-09-28 21:00:25

Javascript:原型模式类继承的相关文章

Javascript原型模式总结梳理

在大多数面向对象语言中,对象总是由类中实例化而来,类和对象的关系就像模具跟模件一样.Javascript中没有类的概念,就算ES6中引入的class也不过是一种语法糖,本质上还是利用原型实现.在原型编程语言中,类并不是必需的,对象不一定需要由类实例化而来,而是通过克隆另外一个对象来得到. 原型模式是用来创建对象的一种模式.在以类为中心的语言中,要创建一个对象首先要指定这个对象的类型,然后实例化一个对象.使用原型模式创建对象时不必关心对象的具体类型,而是找到一个对象,然后通过克隆来创建一个一模一样

JavaScript原型链和继承

1.概念 JavaScript并不提供一个class的实现,在ES6中提供class关键字,但是这个只是一个语法糖,JavaScript仍然是基于原型的.JavaScript只有一种结构:对象.每个对象都有一个私有属性:_proto_,这个属性指向它构造函数的原型对象(property).它的原型对象也有一个属于自己的原型对象,这样层层向上知道一个对象的属性为null.根据定义null没有原型,它是这个原型链中的最后一个环节. 几乎所有的JavaScript中的对象都是位于原型链顶端的Objec

JavaScript模拟Java类继承

javascript采用原型继承的方式继承一个类(javascript没有类这个概念,暂时这么称呼吧),但一些使用过Java的程序员可能习惯使用经典的类继承,但javascript原生并不支持这种方式,因此需要手动实现.这里通过定义一个定义类(defineClass)的函数实现,经测试越用越顺手.由于javascript没有访问修饰符,因此如果需要使用到private成员,请使用闭包. 1 /* 简单的对象扩充方法 2 */ 3 merge:function (target, origin) {

JavaScript原型模式

一.提到原型模式,和构造函数关系密切,先讲一下它 javascript没有类,通过函数来模拟实现类,用new来创建对象,函数内部的this指针来指向调用它的对象. 事例中创建对象myGril,这个对象就获取了构造函数内this指向的所有属性和方法. var GirlFriend=function (temperament) { this.temperament=temperament; this.loseTemper=function(){ return "When angry:"+t

javascript 原型实现的继承

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <meta http-equiv="Content-Type"

(2)基于原型的类继承

1 version 1 var Animal = function(){ this.init(this,arguments); }; //init Animal.prototype.init = function(color){ this.color = color; }; Animal.prototype.breath = function(){ console.log("breath"); }; var Dog = function(){}; Dog.prototype = new

javascript原型模式发展历程

// 工厂模式 function Person(name,age){ var o = new Object(); o.name=name; o.age=age; o.sayName=function(){ alert(o.name) } return o } var o1=Person('lele',5) var o2=Person('mama',31) // 构造函数模式(能够标识对象属于哪一种类型,但是函数没有复用) function Person(name,age){ this.name=

JavaScript 原型链、继承

对象创建 javascript 中原型我们应该最熟悉,记得刚接触js时候最长说的一句话就是,万事万物皆对象,额那时的我不怎么懂,嗯...现在的我感觉说的js里这么说确实有一定的道理,可见js中对象的重要性.好的那么创建对象的方法有以下几种方式吧: 以上那对象的创建方式:字面量.构造函数.Object.create(); 原型链 记得当时项目开发中有个同事问到我的一个问题,你给我讲讲原型链呗,上网搜了张图,这张图我觉得很能诠释所有的关系列表,以及几者之间有联系,基本上很清晰: // 构造函数 ==

javascript 原型链实现继承简单例子

function A(){ this.name="zhangsan"; } A.prototype.getName=function(){ return this.name; } function B(){ this.age=20; } B.prototype=new A(); //子类型有时候需要重写超类型中的某个方法,或者需要添加母类型中不存在的某个方法.但不管怎 样,给原型添加方法的代码一定要放在替换原型的语句之后. B.prototype.getAge=function(){