javascript的new函数与java中的new虽然同是创建对象,但是有根本的区别,java中用new创建对象时是为对象分配空间和初始化变量,而javascript使用new创建对象时实际上是先创建了一个Object对象,然后在这个对象上执行函数,例如:
var car = new Car();
相当于
var car = new Object();
Car.call(car);
通过这个原理我们可以抛弃new,然后自定义一个函数来封装创建对象的过程,从而实现继承。
构造器原理实现继承与原型继承相比较有如下优势:
1.原型继承初始化对象时父类的属性会被多次初始化;构造器原理继承只需要每个属性初始化一次,提高了性能。
2.原型继承访问对象元素时需要遍历原型链;构造器原理继承对象的所有元素和从父类中继承的元素均在当前对象上,不需要遍历原型链,提高了性能。
3.如果要在已经存在的json对象上执行类函数,原型继承需要重新创建一个对象,然后进行对象转换;构造器原理继承不需要创建新的对象,可以直接在当前对象上执行函数,提高了性能和代码灵活性。
4.原型链继承只能实现单一继承;构造器原理继承可以实现多继承,提高了代码灵活性。
5.原型链继承无法将子类构造器中的形参传给父类构造器,构造器原理继承可以将子类构造器中的形参逐层传递给父类构造器,提高了代码灵活性。
6.原型继承子类构造器会被父类覆盖,需要再手动为子类指定构造器;构造器原理继承子类和父类构造器相互独立,使用创建对象时子类构造器先调用父类构造器,更符合面向对象构造器原理。
7.子类对象调用父类set方法为属性赋值时,会在子类中重新定义一个同名属性,父类属性的原始值并没有得到真正修改;构造器原理则真正修改了从父类中继承的属性的值。
构造器原理实现继承与原型继承相比较有如下不足:
1.构造器原理的子类覆盖父类方法或属性后,该属性就会被替换,原来在父类中定义的属性或方法会被销毁,如果需要在子类中访问被覆盖的父类成员,则需要在覆盖前进行备份。如Bird.move()的实现;原型继承的子类不是替换父类的成员定义,而是在当前原型链中重新声明和定义,子类访问父类被覆盖的成员可以这样:this.contractor.prototype.move.call(this);
其中this代表当前子类。
---------------附文章源码(粘贴可运行,本机测试环境IE8)----------------
生物是基类,动物继承生物类,鸟类继承生物类
/**
* 生物体,
* 具有属性:age;
* 方法:成长;
*/
function Organism()
{
/**
* 生长,每生长一次,年龄加1
*/
this.pullulate = function()
{
this.age++ ;
};
this.getAge = function()
{
return this.age;
};
/*
* 重写toString函数
*/
this.toString = function()
{
return JSON.stringify(this);
};
};
Organism.create = function()
{
var obj = {age:0};
Organism.call(obj);
return obj;
};
/**
* 动物,生物的子类
* 属性:speed
* 方法:移动
*/
function Animal()
{
this.move = function()
{
return "moving speed:" + this.speed;
};
};
//new 原理继承
Animal.create = function(speed)
{
var obj = Organism.create();
obj.speed = speed;
Animal.call(obj);
return obj;
};
/**
* 鸟:继承动物
*/
function Bird()
{
//重写父类方法前先将父类方法备份,这样就可以调用父类方法了
var parentMove = this.move;
this.move = function()
{
//使用call在当前对象上调用父类方法
return parentMove.call(this) + "---->flying";
};
};
//new 原理继承
Bird.create = function(speed)
{
var obj = Animal.create();
obj.speed = speed;
Bird.call(obj);
return obj;
};
//原型继承
//Animal.prototype = new Organism();
//Animal.prototype.contractor = Animal;
var a1 = Animal.create(160);
var a2 = Animal.create(260);
var b1 = Bird.create(300);
var b2 = Bird.create(500);
a1.pullulate();
a1.pullulate();
a2.pullulate();
document.write('a1 age=' + a1.getAge()) ;
document.write('<br>');
document.write('a2 age=' + a2.getAge()) ;
document.write('<br>');
document.write('a1 : ' + a1.move()) ;
document.write('<br>');
document.write('a2 : ' + a2.move()) ;
document.write('<br>');
document.write('b1 : ' + b1.move()) ;
document.write('<br>');
document.write('b2 : ' + b2.move()) ;
document.write('<br>');
b2.pullulate();b2.pullulate();b2.pullulate();
document.write('b2 : ' + b2) ;
var o1 = {a:20};
var o2 = o1;
o2.a = 30;
document.write(o1.a + "" + o2.a);
分享到:
相关推荐
本文将深入探讨JavaScript继承的实现方式,以及其中的问题和解决方案。 首先,我们来看混合方式的实现,这种方式结合了原型链和对象冒充。在JavaScript中,构造函数是用于创建特定类型对象的函数。例如,`Employee`...
### 理解Javascript原型继承原理 #### 一、引言 在JavaScript中,原型继承是一种非常核心且独特的机制,它使得对象能够继承其他对象的属性和方法。本文旨在深入探讨这一机制,并通过具体的示例代码帮助读者更好地...
在实现继承时,常常会使用到`new`关键字。`new`操作符会创建一个新的对象,并将该对象的`__proto__`指向构造函数的`prototype`。然后,构造函数内部的`this`会被设置为新创建的对象,从而允许在构造函数内部设置新...
此外,JavaScript还提供了其他实现继承的方式,如使用`__proto__`直接修改原型,或者使用ES6中的`class`语法糖,这些方法在不同场景下各有优势。总的来说,理解JavaScript中的构造函数和原型是掌握继承的关键,而...
### JavaScript原型继承工作原理及实例详解 #### 一、引言 JavaScript作为一种广泛使用的脚本语言,在Web开发中扮演着重要角色。其独特的面向对象机制是通过原型继承来实现的,这种机制使得JavaScript能够灵活地...
3. new 的原理实现 学习和参考于: JS定义类的六种方式详解 JS实现继承的几种方式 JavaScript深入之创建对象的多种方式以及优缺点 js new一个对象的过程,实现一个简单的new方法 (一)类的创建 1. 工厂模式 ...
本文将深入探讨JavaScript中的几种继承方式,包括它们的基本原理、优缺点以及适用场景。 首先,原型链继承是JavaScript中最早实现继承的方式。它基于原型链机制,即每个对象都有一个`__proto__`属性,指向创建该...
### JavaScript继承的三种方法实例详解 #### 一、概述 在JavaScript中,虽然原生语言层面没有提供传统意义上的“类”这一概念,但它通过构造函数和原型链等机制实现了类的功能,尤其是继承这一核心概念。继承是...
JavaScript的原型继承是其面向对象编程的一大特性,它基于原型链机制实现,允许一个对象可以从另一个对象继承属性和方法。这种继承方式不同于类继承,而是通过将子类的原型对象设置为父类的一个实例来实现。 在...
本文将深入探讨JavaScript中的原型继承机制,帮助读者理解其中的关键概念及其工作原理。 #### 二、原型与构造函数 在JavaScript中,每个函数都有一个特殊的属性——`prototype`。当一个函数被用作构造函数时,它的...
本文将详细介绍JavaScript中的类继承概念,包括基本原理、实现方式以及一些高级用法。 #### 二、继承概述 在JavaScript中,继承主要通过原型链来实现。每个对象都有一个`prototype`属性,指向它的原型对象。当尝试...
首先,我们需要明确一点,JavaScript是一种...以上就是关于JavaScript中通过prototype属性实现继承的原理图的核心知识点。在实际应用中,我们通常根据具体的场景选择适合的继承方式,以达到代码复用和功能扩展的目的。
本文将详细介绍JavaScript中的六种继承方式,包括它们的工作原理以及实际应用示例。 #### 二、原型链继承 **1. 原理概述** 原型链继承是JavaScript中最基础也是最直接的继承方式之一。它的核心思想是利用原型对象...
JavaScript是一种广泛应用于Web开发的动态编程语言,它的工作原理基于弱数据类型,允许开发者创建复杂的对象来存储和处理数据。本文将深入探讨JavaScript的工作原理以及对象的详细概念。 首先,JavaScript中有两种...
虽然有传言JavaScript 2.0将加入类继承机制,但考虑到要让所有浏览器支持新特性可能需要很长时间,因此目前只能依靠现有的机制来实现对象的继承。 在JavaScript中,继承主要通过原型链实现。首先,我们需要区分几个...
JavaScript中的原型模式是一种实现面向对象编程(OOP)的关键机制,它基于原型继承,使得对象可以从其他对象那里获得属性和方法。在这个模式下,每个函数都有一个`prototype`属性,这个属性是一个对象,用于共享属性...
通过以上的分析,我们了解了`new`操作符在JavaScript中的工作原理,包括如何创建新对象、设置原型链、绑定`this`上下文以及返回新对象。这些知识对于深入理解和使用JavaScript的面向对象编程至关重要。
JavaScript原型继承是面向对象编程在JavaScript中的实现方式之一,它基于原型(Prototype)和对象的特性,使得一个对象可以继承另一个对象的属性和方法。在JavaScript中,每个对象都有一个特殊的内部属性`[...