先定義一個物件obj,該物件的原型為obj._proto_,我們可以用es5中的getprototypeof這一方法來查詢obj的原型,我們透過判斷obj的原型是否與object.prototype相等來證明是否存在obj的原型,答案回傳true,所以存在。然後我們定義一個函數foo(),任何一個函數都有它的prototype對象,即函數的原型,我們可以在函數的原型上添加任意屬性,之後透過new一個實例化的對象可以共享其屬性(下面的兩個例子會詳細介紹)。
function foo(){} foo.prototype.z = 3; var obj = new foo(); obj.x=1; obj.y=2; obj.x //1 obj.y //2 obj.z //3 typeof obj.tostring; //function obj.valueof(); // foo {x: 1, y: 2, z: 3} obj.hasownproperty('z'); //false
在這裡,obj的原型(_proto_)指向foo函數的prototype屬性,foo.prototype的原型指向object.prototype,原型鏈的末端則為null,透過hasownproperty查看z屬性是否是obj上的,顯示false,則obj上本沒有z屬性,但透過查找其原型鏈,發現在foo.prototype上有,所以obj.z=3,並且對於首例上obj.valueof()以及tostring都是object .prototype上的,所以任何一個物件都有這兩個屬性,因為任何一個物件的原型都是object.prototype.當然除了以下一個特例,
<span>var</span> obj2 = object.create(<span>null</span><span>);obj2.valueof(); </span><span>//</span><span>undefined</span>
object.create()為建立一個空對象,而此對象的原型指向參數。下面一個綜合實例向大家展示如何實作一個class來繼承另外一個class
//声明一个构造函数person function person(name,age){ this.name = name; this.age = age; } person.prototype.hi = function (){ console.log('hi,my name is ' + this.name +',my age is '+this.age); }; person.prototype.legs_num=2; person.prototype.arms_num=2; person.prototype.walk = function (){ console.log(this.name+' is walking !'); }; function student(name,age,classnum){ person.call(this,name,age); this.classnum = classnum; } //创建一个空对象 student.prototype = object.create(person.prototype); //constructor指定创建一个对象的函数。 student.prototype.constructor = student; student.prototype.hi = function (){ console.log('hi,my name is ' + this.name +',my age is '+this.age+' and my class is '+this.classnum); }; student.prototype.learns = function (sub){ console.log(this.name+' is learning '+sub); }; //实例化一个对象bosn var bosn = new student('bosn',27,'class 3'); bosn.hi(); //hi,my name is bosn,my age is 27 and my class is class 3 bosn.legs_num; //2 bosn.walk(); //bosn is walking ! bosn.learns('math'); //bosn is learning math
建構函式person與student的this指向實例化的物件(bosn),而此物件的原型指向建構器的prototype。
我們用object.create()方法來建立一個空對象,此物件的原型事項person.prototype,這樣寫的好處是我們可以在不影響person.prototype屬性的前提下可以自己建立studnet .prototype的任意屬性,並且可以繼承person.prototype上原有的屬性,因為子類別student是繼承基底類別person的。如果直接寫person.prototype = student.prototype,那他兩同時指向一個對象,在給student.prototype添加屬性的同時,person的原型鏈上也會增加同樣的屬性。
對於建構子student裡面的call方法,裡面的this指向新建立的student的實例化的對象,並透過call來實現繼承。
student.prototype.constructor = student,這句話的意思是指定student為建立student.prototype這個物件的函數,如果不寫這句話,該物件的函數還是person。
對於繼承,一共有三種方式來實現,
function Person(name,age){ this.name = name; this.age = age; } function Student(){ } Student.prototype = Person.prototype; //1 Student.prototype = Object.create(Person.prototype); //2 Student.prototype = new Person(); //3
以上這篇js原型鏈與繼承解析(初體驗)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Dreamweaver Mac版
視覺化網頁開發工具