❶ 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();