1.怎样实现只继承prototype先看下面的代码:function A(){this.name="李可可";this.age=21; } A.prototype.eat=function(){ console.log("I can eat") } function B(){} B.prototype=new A;//B继承了A var cc=new B; cc.eat();//I can eat cc.name;//"李可可"我们可以看到的是,A继承了B的所有属性,那如果我们只想让B继承A.prototype属性,不想要A上面的name和age等一大堆没用的东西,那该怎么办?有人可能就说了,直接像下面这样...
JavaScript中的prototype概念恰如其分地反映了这个词的内含,我们不能将其理解为C++的prototype那种预先声明的概念。 JavaScript 的所有function类型的对象都有一个prototype属性。这个prototype属性本身又是一个object类型的对象,因此我们也可以给这个prototype对象添加任意的属性和方法。既然prototype是对象的“原型”,那么由该函数构造出来的对象应该都会具有这个“原型”的特性。事实上,在构造函数的prototype上定义的所有...
我们先看看这样一段代码: 代码如下: var Person = function () { }; var p = new Person(); 很简单的一段代码,我们来看看这个new究竟做了什么?我们可以把new的过程拆分成以下三步: var p={}; 也就是说,初始化一个对象p。 p.__proto__=Person.prototype; Person.call(p);也就是说构造p,也可以称之为初始化p。 关键在于第二步,我们来证明一下: 代码如下: var Person = function () { }; var p = new Person(); aler...
数据属性: 数据属性包含一个数据值的位置,在这个位置可以读取和写入值。 4个描述的行为特性: writable 表示能否修改属性的值。默认为true Enumerable 表示能否过过for in循环返回属性是否可以枚举。 configuralbe 表示是否能过来delete删除属性从来重新定义属性,能否修改其配置。 value 包含这个属性的数据值。读取属性值的时候,从这个位置读取。 写入属性值的时候,把新值保存在这个位置。这个特性的默认值为true。function ...
原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对象有”constructor”属性。 一、初识原型 在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript的对象中都包含了一个”[[Prototype]]”内部属性,这个属性所对应的就是该对象的原型。 “[[Prototype]]”作为对象的内部属性,是不能被直接访问的。所以为了方便查看一个对...
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function)。 一般而言,通过new Function产生的对象是函数对象,其他对象都是普通对象。 举例说明:function f1(){//todo } var f2 = function(){//todo }; var f3 = new Function('x','console.log(x)');var o1 = {}; var o2 = new Object(); var o3 = new f1();console.log(typeof f1,//functiontypeof f2,//functiontypeof ...
以问题开始: function Base(){}var base = new Base() 上面两行代码会创建几个对象(object)? 要回答这个问题,先明确一下Javascript里object的概念。 Objects 在Javascript里,几乎一切都是object(Arrays、Functions、Numbers、Objects……),而没有C#里的class的概念。object的本质是一个name-value pairs的集合,其中name是string类型的,可以把它叫做“property”,value包括各种objects(string,number,boolean,array,...
Function和Object都是函数的实例 Function的父原型指向到Function的原型,Function的原型的父原型是Object的原型。 Object的父原型也指向到Function的原型。 一个实例的对像,它的默认的父原型为其构造函数的显示原型 [每个对像都有一个隐慝的属性用于指向到它的父对像(构造对像的函数)的原型(这里称为父原型或隐式原型)。因为原型也是对像,所以原型也有父原型,Object的原型是所有父原型的顶层(原型根),这样就形成了所谓原型链...
在使用面向对象编程时,对象间的继承关系自然少不了!而原型正是实现javascript继承的很重要的一种方法! 我们首先来看以下代码: 代码如下: function person(name, age) { this.name = name; this.age = age; } person.prototype.getInfo = function() { alert("My name is "+this.name+", and I have "+this.age+" years old"); } var zhangchen = new person("zhangchen", 23); zhangchen.getInfo(); //output My name is zhan...
Javascript中所有function中都有一个prototype属性,并且这个prototype属性是一个object类型的对象,所有由该function构造出来的对象都具有这个prototype上的特性,也就是说可以用构造出来的对象直接访问prototype上的属性和方法。 下面一段代码演示prototype的使用方法: 代码如下: function Staff(name) { this.name = name; } Staff.prototype.say = function() { alert(this.name + " say hello"); } var staff1 = new Staff(...
前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型。 虽然这经常被当作是 JavaScript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大。实现传统的类继承模型是很简单,但是实现 JavaScript 中的原型继承则要困难的多。 由于 JavaScript 是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链。 原型 10年前,我刚学习Java...
当初ECMAscript的发明者为了简化这门语言,同时又保持继承的属性,于是就设计了这个链表。。 在数据结构中学过链表不,链表中有一个位置相当于指针,指向下一个结构体。 于是乎__proto__也一样,每当你去定义一个prototype的时候,相当于把该实例的__proto__指向一个结构体,那么这个被指向结构体就称为该实例的原型。 文字说起来有点儿绕,看图说话 代码如下: var foo = { x: 10, y: 20 }; 当我不指定__proto__的时候,foo也会预...
什么是继承啊?答:别人白给你的过程就叫继承。 为什么要用继承呢?答:捡现成的呗。 好吧,既然大家都想捡现成的,那就要学会怎么继承! 在了解之前,你需要先了解构造函数、对象、原型链等概念...... JS里常用的两种继承方式: 原型链继承(对象间的继承)类式继承(构造函数间的继承) 原型链继承:代码如下://要继承的对象var parent={name : "baba" say : function(){ alert("I am baba");}} //新对象var child = proIn...
构造函数、原型实现继承的缺陷 首先来分析构造函数和原型链两种实现继承方式的缺陷: 构造函数(对象冒充)的主要问题是必须使用构造函数方式,且无法继承通过原型定义的方法,这不是最好的选择。不过如果使用原型链,就无法使用带参数的构造函数了。开发者如何选择呢?答案很简单,两者都用。 构造函数+原型混合方式 这种继承方式使用构造函数定义类,并非使用任何原型。创建类的最好方式是用构造函数定义属性,用原型定义方法。这...
如果用原型方式重定义前面例子中的类,它们将变为下列形式: 代码如下:function ClassA() {} ClassA.prototype.color = "blue";ClassA.prototype.sayColor = function () { alert(this.color);}; function ClassB() {} ClassB.prototype = new ClassA();原型方式的神奇之处在于最后一行代码。这里,把 ClassB 的 prototype 属性设置成 ClassA 的实例。这很有意思,因为想要 ClassA 的所有属性和方法,但又不想逐个将它们 添加到...