导航:首页 > 方法技巧 > 如何重写并且继承js方法

如何重写并且继承js方法

发布时间:2022-04-19 01:25:50

❶ js实现继承的几种方法

《继承法》第二十三条 继承开始后,知道被继承人死亡的继承人应当及时通知其他继承人和遗嘱执行人。继承人中无人知道被继承人死亡或者知道被继承人死亡而不能通知的,由被继承人生前所在单位或者住所地的居民委员会、村民委员会负责通知。第二十四条 存有遗产的人,应当妥善保管遗产,任何人不得侵吞或者争抢。第二十五条 继承开始后,继承人放弃继承的,应当在遗产处理前,作出放弃继承的表示。没有表示的,视为接受继承。受遗赠人应当在知道受遗赠后两个月内,作出接受或者放弃受遗赠的表示,到期没有表示的,视为放弃受遗赠。第二十六条 夫妻在婚姻关系存续期间所得的共同所有的财产,除有约定的以外,如果分割遗产,应当先将共同所有的财产的一半分出为配偶所有,其余的为被继承人的遗产。遗产在家庭共有财产之中的,遗产分割时,应当先分出他人的财产。第二十七条 有下列情形之一的,遗产中的有关部分按照法定继承办理:遗嘱继承人放弃继承或者受遗赠人放弃受遗赠的;遗嘱继承人丧失继承权的;遗嘱继承人、受遗赠人先于遗嘱人死亡的;遗嘱无效部分所涉及的遗产;遗嘱未处分的遗产。第二十八条 遗产分割时,应当保留胎儿的继承份额。胎儿出生时是死体的,保留的份额按照法定继承办理。第二十九条 遗产分割应当有利于生产和生活需要,不损害遗产的效用。不宜分割的遗产,可以采取折价、适当补偿或者共有等方法处理。第三十条 夫妻一方死亡后另一方再婚的,有权处分所继承的财产,任何人不得干涉。第三十一条 公民可以与扶养人签订遗赠扶养协议。按照协议,扶养人承担该公民生养死葬的义务,享有受遗赠的权利。公民可以与集体所有制组织签订遗赠扶养协议。按照协议,集体所有制组织承担该公民生养死葬的义务,享有受遗赠的权利。第三十二条无人继承又无人受遗赠的遗产,归国家所有;死者生前是集体所有制组织成员的,归所在集体所有制组织所有。第三十三条 继承遗产应当清偿被继承人依法应当缴纳的税款和债务,缴纳税款和清偿债务以他的遗产实际价值为限。超过遗产实际价值部分,继承人自愿偿还的不在此限。继承人放弃继承的,对被继承人依法应当缴纳的税款和债务可以不负偿还责任。第三十四条 执行遗赠不得妨碍清偿遗赠人依法应当缴纳的税款和债务。

❷ javascript实现继承有哪些方式

Javascript的继承在很多书里面细致的分了很多种类型和实现方式,大体上就是两种:对象冒充、原型方式。这两种方式各有优点和缺陷,这里我给你先列举出来,再从底层分析区别:

(一)对象冒充

function A(name){
this.name = name;
this.sayHello = function(){alert(this.name+” say Hello!”);};
}
function B(name,id){
this.temp = A;
this.temp(name); //相当于new A();
delete this.temp; //防止在以后通过temp引用覆盖超类A的属性和方法
this.id = id;
this.checkId = function(ID){alert(this.id==ID)};
}

当构造对象B的时候,调用temp相当于启动A的构造函数,注意这里的上下文环境中的this对象是B的实例,所以在执行A构造函数脚本时,所有A的变量 和方法都会赋值给this所指的对象,即B的实例,这样子就达到B继承了A的属性方法的目的。之后删除临时引用temp,是防止维护B中对A的类对象(注 意不是实例对象)的引用更改,因为更改temp会直接导致类A(注意不是类A的对象)结构的变化。

我们看到了,在Js版本更新的过程中,为了更方便的执行这种上下文this的切换以达到继承或者更加广义的目的,增加了call和apply函数。它们的 原理是一样的,只是参数不同的版本罢了(一个可变任意参数,一个必须传入数组作为参数集合)。这里就以call为例子,解释一下用call实现的对象冒充 继承。

function Rect(width, height){
this.width = width;
this.height = height;
this.area = function(){return this.width*this.height;};
}
function myRect(width, height, name){
Rect .call(this,width,height);
this.name = name;
this.show = function(){
alert(this.name+” with area:”+this.area());
}
}

关于Call方法,官方解释:调用一个对象的一个方法,以另一个对象替换当前对象。
call (thisOb,arg1, arg2…)

这也是一种对象冒充的继承,其实在call方法调用的时候发生的事情也是上下文环境变量this的替换,在myRect函数体中this肯定是指向类 myRect对象的实例了,然而用这个this作为上下文环境变量调用名字叫Rect方法,即类Rect的构造函数。于是此时调用Rect时候对this 的赋值属性和方法都实际上是对一个myRect的对象进行。所以说尽管call和apply并不是仅仅为了继承而新增的方法,但用它们可以模拟继承。

对象冒充继承就是这么一回事,它可以实现多重继承,只要重复做这一套赋值的流程就可以了。不过目前真正大规模使用得并不多,为什么呢?因为它有一个明显的 性能缺陷,这就要说道OO的概念了,我们说对象是成员+成员方法的集合,构造对象实例的时候,这些实例只需要拥有各自的成员变量就可以了,成员方法只是一 段对变量操作的可执行文本区域而已,这段区域不用为每个实例而复制一份,所有的实例都可以共享。现在回到Js利用对象冒充模拟的继承里,所有的成员方法都 是针对this而创建的,也就是所所有的实例都会拥有一份成员方法的副本,这是对内存资源的一种极度浪费。其它的缺陷比如说对象冒充无法继承 prototype域的变量和方法就不用提了,笔者认为前一个致命缺陷就已经足够。不过,我们还是需要理解它,特别是父类的属性和方法是如何继承下来的原 理,对于理解Js继承很重要。

(二)原型方式
第二种继承方式是原型方式,所谓原型方式的继承,是指利用了prototype或者说以某种方式覆盖了prototype,从而达到属性方法复制的目的。 其实现方式有很多中,可能不同框架多少会有一点区别,但是我们把握住原理,就不会有任何不理解的地方了。看一个例子(某一种实现):

function Person(){
this.name = “Mike”;
this.sayGoodbye = function(){alert(“GoodBye!”);};
}
Person.prototype.sayHello = function(){alert(”Hello!”);};
function Student(){}
Student.prototype = new Person();

关键是对最后一句Student原型属性赋值为Person类构造的对象,这里笔者解释一下父类的属性和方法是如何到子类上的。Js对象在读取某 个对象属性的时候,总是先查看自身域的属性列表,如果有就返回否则去读取prototype域(每个对象共享构造对象的类的prototype域所有属性 和方法),如果找到就返回,由于prototype可以指向别的对象,所以Js解释器会递归的去查找prototype域指向对象的prototype 域,直到prototype为本身,查找变成了一种循环,就停止,此时还没找到就成undefined了。

这样看来,最后一句发生的效果就是将父类所有属性和方法连接到子类的prototype域上,这样子类就继承了父类所有的属性和方法,包括name、 sayGoodbye和sayHello。这里与其把最后一句看成一种赋值,不如理解成一种指向关系更好一点。这种原型继承的缺陷也相当明显,就是继承时 父类的构造函数时不能带参数,因为对子类prototype域的修改是在声明子类对象之后才能进行,用子类构造函数的参数去初始化父类属性是无法实现的, 如下所示:

function Person(name){
this.name = name;
}
function Student(name,id){
this.id = id;
}
Student.prototype = new Person(this.name);

两种继承方式已经讲完了,如果我们理解了两种方式下子类如何把父类的属性和方法“抓取”下来,就可以自由组合各自的利弊,来实现真正合理的Js继承。下面是个人总结的一种综合方式:

function Person(name){
this.name = name;
}
Person.prototype.sayHello = function(){alert(this.name+“say Hello!”);};
function Student(name,id){
Person.call(this,name);
this.id = id;
}
Student.prototype = new Person();
Student.prototype.show = function(){
alert(“Name is:”+ this.name+” and Id is:”+this.id);
}

总结就是利用对象冒充机制的call方法把父类的属性给抓取下来,而成员方法尽量写进被所有对象实例共享的prototype域中,以防止方法副本重复创 建。然后子类继承父类prototype域来抓取下来所有的方法。如想彻底理清这些调用链的关系,推荐大家多关注Js中prototype的 constructor和对象的constructor属性,这里就不多说了。

❸ js对象的构造和继承实现代码

复制代码
代码如下:
<script>
//定义js的user对象
function
User(name,age){
this.name=name,
this.age=age,
this.getName=function(){
return
this.name;
},
this.getAge=function(){
return
this.age;
}
}
//实例化一个对象
var
use=new
User("aa",21);
alert(use.name);
alert(use.getAge());
//js对象继承
/*
jb51.net
在面向对象的编程方法中,对象继承是必不可少的,那么怎么在javascript中实现继承机制呢。由于javascript并不是一个严格的面向对象的语言,因此在对象继承上也显的不一样。我们也来创建一个基类Polygon,代表一个多边形,一个多边形有个共同的属性就是边数(sides)和一个共同的方法计算面积(getAreas)。这样我们的这具Polygon类看起来就像下面这样定义:
*/
function
Polygon(iSides){
this.sides
=
iSides;
}
Polygon.prototype.getAreas
=
function(){
return
0;
}
/*
因为基类并不能确定面积,因此在这里我们返回为0。
接着我们就创建一个子类Triangle,一个三角形,显然这个三角形是要从多边形继承的,因此我们要让这个Triangle类继承Polygon类,并且要覆盖Polygon类的getAreas方法来返回三角形的面积。我们来看下在javascript中的实现:
*/
function
Triangle(iBase,
iHeight){
Polygon.call(this,3);
//在这里我们用Polygon.call()来调用Polygon的构造函数,并将3作为参数,表示这是一个三角形,因为边是确定的,所以在子类的构造函数中就不需要指定边了
this.base
=
iBase;
//三角形的底
this.height
=
iHeight;
//三角形的高
}
Triangle.prototype
=
new
Polygon();
Triangle.prototype.getAreas
=
function(){
return
0.5
*
this.base
*this.height;
//覆盖基类的getAreas方法,返回三角形的面积
}
/*
参考上面的实现,我们再定义一个矩形:
*/
function
Rectangle(iWidth,
iHeight){
Polygon.call(this,4);
this.width
=
iWidth;
this.height
=
iHeight;
}
Rectangle.prototype
=
new
Polygon();
Rectangle.prototype.getAreas
=
function(){
return
this.width
*
this.height;
}
/*
好了,上面我们定义了一个基类和两个子数,下面我们来测试一个这两个子类是否能正常工作:
*/
var
t
=
new
Triangle(3,6);
var
r
=
new
Rectangle(4,5);
alert(t.getAreas());
//输出9说明正确
alert(r.getAreas());
//输出20说明正确
</script>

❹ JS继承以及继承的几种实现方式总结

function Parent(firstname) { this.fname=firstname; this.age=40; this.sayAge=function() { console.log(this.age); } } function Child(firstname) { this.parent=Parent; this.parent(firstname); delete this.parent; this.saySomeThing=function() { console.log(this.fname); this.sayAge(); } } var mychild=new Child("李"); mychild.saySomeThing();

❺ js中子类重写父类中方法, 重写方法中用到父类的方法怎么调用呢

子类重写方法是在基类有此方法重写,那么声名一个子类的对象,调用的方法是子类的方法,
通过base转而调用父类中的方法,最终目的还是调用父类中的方法。
还有重写方法可以改变基类方法的作用,可以实现其他的效果,重写方法,和基类同名方法是两个不同实现的方法,
最主要你要分清楚 重写跟基类中的方法不一定实现同样的效果,还有基类也不一定知道派生类中是否重写了这个方法

❻ 关于JS实现继承的方法都有哪一些

定义一个父类:
// 定义一个动物类
function Animal (name) {
// 属性
this.name = name || ‘Animal’;
// 实例方法
this.sleep = function(){
console.log(this.name + ‘正在睡觉!’);
}
}
// 原型方法
Animal.prototype.eat = function(food) {
console.log(this.name + ‘正在吃:’ + food);
1.原型链继承
核心:将父类的实例作为子类的原型
function Cat(){
}
Cat.prototype = new Animal();
Cat.prototype.name = ‘cat’;

//Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.eat(‘fish’));
console.log(cat.sleep());
console.log(cat instanceof Animal); //true
console.log(cat instanceof Cat); //true
特点:
1.非常纯粹的继承关系,实例是子类的实例,也是父类的实例
2.父类新增的原型方法、属性,子类都能访问到
3.简单,易于实现
缺点:
1.要想为子类新增属性和方法,必须要在new Animal()这样的语句之后执行
(可以在cat构造函数中,为Cat实例增加实例属性)
2.无法实现多继承
3.来自原型对象的引用属性被所有实例共享
4.创建子类实例时,无法向父类构造函数传参
下面代码解释缺点3(注意是引用属性):
function Super(){
this.val = 1;
this.arr = [1];
}
function Sub(){
// ...
}
Sub.prototype = new Super(); // 核心
var sub1 = new Sub();
var sub2 = new Sub();
sub1.val = 2;
sub1.arr.push(2);
alert(sub1.val); // 2
alert(sub2.val); // 1
alert(sub1.arr); // 1, 2
alert(sub2.arr); // 1, 2

2.构造继承
核心:使用父类的构建函数来增强子类实例,等于复制父类的实例属性给子类(没用到原型),除了call方法,也可以用apply()
function Cat(name){
Animal.call(this);
this.name = name || ‘Tom’;
}
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true
特点:
1.解决了1中,子类实例共享父类引用属性的问题
2.创建子类实例时,可以向父类传递参数
3.可以实现多继承(call多个父类对象)
缺点:
1.实例并不是父类的实例,只是子类的实例
2.只能继承父类的实例属性和方法,不能继承原型属性和方法
3.无法实现函数复用,每个子类都有父类的实例函数的副本,影响性能

3.实例继承
核心:为父类实例添加新特性,作为子类实例返回
function Cat(name){
var instance = new Animal();
instance.name = name || ‘Tom’;
return instance;
}
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // false
特点:
1.不限制调用方式,不管是new 子类()还是子类(),返回的对象都具有相同的效果
缺点:
1.实例是父类的实例,不是子类的实例
2.不支持多继承

4. 拷贝继承
核心:使用for…in将父类实例中的方法赋给子类实例
unction Cat(name){
var animal = new Animal();
for(var p in animal){
Cat.prototype[p] = animal[p];
}
Cat.prototype.name = name || ‘Tom’;
}

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true
特点:
1.支持多继承
缺点:
1.效率较低,内存占用高(因为要拷贝父类的属性)
2.无法获取父类不可枚举的方法(for in无法访问不可枚举的方法)

5.组合继承
核心:通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用
function Cat(name){
Animal.call(this);
this.name = name || ‘Tom’;
}
Cat.prototype = new Animal();

//组合继承需要修复构造函数的指向
Cat.prototype.constructor=Cat;
// Test Code

var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // true
特点:
1.弥补了方式2的缺陷,可以继承实例属性、方法,也可以继承原型属性、方法
2.既是子类的实例,也是父类的实例
3.不存在引用属性的共享问题
4.可传参
5.函数可复用
缺点:
1.调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了)

6.寄生组合继承
核心:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免的组合继承的缺点
function Cat(name){
Animal.call(this);
this.name = name || ‘Tom’;
}
(function(){
// 创建一个没有实例方法的类
var Super = function(){};
Super.prototype = Animal.prototype;
//将实例作为子类的原型
Cat.prototype = new Super();
//寄生组合继承需要修复构造函数的指向
Cat.prototype.constructor=Cat;
})();

// Test Code

var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); //true
特点:
1.堪称完美
缺点:
1.实现较为复杂 (BY三人行慕课)

❼ JS怎么重写函数的方法

这个toFixed函数是js的原生函数 不需要另外加的
不过如果你自己需要扩展一些原生的对象的一些功能的话 就写在一个js文件里面,然后每个需要用到它的页面,都把这个js文件引入进来就可以了。
例如你需要扩展Date对象,加一个format Date.prototype.format=function(strFormat){}
把这个单独写在一个js文件里,然后在每个页面 中把这个js文件引入就可以了
<script type="text/javascript" src="/js/date.format.js"></script> 比如像这样的
请采纳。

❽ 在Javascript中如何实现继承

js其实没有继承的说法,好点的说法就是伪继承。

下面是原型方式的‘继承’:

<script>
functionPerson(name){//定义一个Person的构造函数
this.name=name;//添加属性
}
Person.prototype.showName=function(){//添加方法
returnthis.name;
};

functionWorker(name,job){
Person.apply(this,arguments);//属性的'继承'
this.job=job;
}
Worker.prototype=newPerson();//方法的'继承'
Worker.prototype.showJob=function(){
returnthis.job;
};
varp1=newPerson('abc');
varw1=newWorker('hh','厨师');

❾ js怎么覆盖原有方法实现重写

js中的函数是没有重写的,如果你写了两个相同的函数,则调用第二个函数。不过在面向对象这一块,对象的方法是可以实现重写的。

❿ javascript中如何实现类的继承啊

js继承有5种实现方式:
1、继承第一种方式:对象冒充
function Parent(username){
this.username = username;
this.hello = function(){
alert(this.username);
}
}
function Child(username,password){
//通过以下3行实现将Parent的属性和方法追加到Child中,从而实现继承
//第一步:this.method是作为一个临时的属性,并且指向Parent所指向的对象,
//第二步:执行this.method方法,即执行Parent所指向的对象函数
//第三步:销毁this.method属性,即此时Child就已经拥有了Parent的所有属性和方法
this.method = Parent;
this.method(username);//最关键的一行
delete this.method;

this.password = password;
this.world = function(){
alert(this.password);
}
}
var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.hello();
child.hello();
child.world();

2、继承第二种方式:call()方法方式
call方法是Function类中的方法
call方法的第一个参数的值赋值给类(即方法)中出现的this
call方法的第二个参数开始依次赋值给类(即方法)所接受的参数

function test(str){
alert(this.name + " " + str);
}
var object = new Object();
object.name = "zhangsan";
test.call(object,"langsin");//此时,第一个参数值object传递给了test类(即方法)中出现的this,而第二个参数"langsin"则赋值给了test类(即方法)的str

function Parent(username){
this.username = username;
this.hello = function(){
alert(this.username);
}
}
function Child(username,password){
Parent.call(this,username);

this.password = password;
this.world = function(){
alert(this.password);
}
}
var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.hello();
child.hello();
child.world();

3、继承的第三种方式:apply()方法方式
apply方法接受2个参数,
A、第一个参数与call方法的第一个参数一样,即赋值给类(即方法)中出现的this
B、第二个参数为数组类型,这个数组中的每个元素依次赋值给类(即方法)所接受的参数

function Parent(username){
this.username = username;
this.hello = function(){
alert(this.username);
}
}
function Child(username,password){
Parent.apply(this,new Array(username));

this.password = password;
this.world = function(){
alert(this.password);
}
}
var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.hello();
child.hello();
child.world();

4、继承的第四种方式:原型链方式,即子类通过prototype将所有在父类中通过prototype追加的属性和方法都追加到Child,从而实现了继承
function Person(){
}
Person.prototype.hello = "hello";
Person.prototype.sayHello = function(){
alert(this.hello);
}

function Child(){
}
Child.prototype = new Person();//这行的作用是:将Parent中将所有通过prototype追加的属性和方法都追加到Child,从而实现了继承
Child.prototype.world = "world";
Child.prototype.sayWorld = function(){
alert(this.world);
}

var c = new Child();
c.sayHello();
c.sayWorld();

5、继承的第五种方式:混合方式
混合了call方式、原型链方式

function Parent(hello){
this.hello = hello;
}
Parent.prototype.sayHello = function(){
alert(this.hello);
}

function Child(hello,world){
Parent.call(this,hello);//将父类的属性继承过来
this.world = world;//新增一些属性
}

Child.prototype = new Parent();//将父类的方法继承过来

Child.prototype.sayWorld = function(){//新增一些方法
alert(this.world);
}

var c = new Child("zhangsan","lisi");
c.sayHello();
c.sayWorld();

阅读全文

与如何重写并且继承js方法相关的资料

热点内容
怎么用简单的方法换一个 浏览:998
dna测序的最简便可行的方法 浏览:448
血球计数板使用方法 浏览:135
做年糕的简单方法视频 浏览:990
简单随机抽样的方法 浏览:164
研究方法名词解释 浏览:426
折手机支架的好方法 浏览:482
大梁承重简单计算方法 浏览:117
用碱治疗灰指甲的方法 浏览:176
320除以40乘30的简便计算方法 浏览:336
20x05用简便方法计算 浏览:945
面轮廓度测量方法视频 浏览:602
腹肌腰椎间盘突出锻炼方法 浏览:267
女补肾壮阳的最佳方法 浏览:447
数值分析方法在工程地质的应用 浏览:927
知识点讲解最简单的方法 浏览:11
五年级梯形怎么剪最简单方法 浏览:73
高粱粑的食用方法 浏览:892
华为荣耀设置壁纸和锁屏图片在哪里设置方法 浏览:509
橡皮泥牡丹花制作方法简单 浏览:459