js高級第二天

構造函數和原型

構造函數和原型

在典型的OOP 的語言中(如Java),都存在類的概念,類就是對象的模板,對象就是類的實例,但在ES6之前,JS 中并沒用引入類的概念。ES6,全稱ECMAScript6.02015.06 發版。但是目前瀏覽器的JavaScript 是ES5 版本,大多數高版本的瀏覽器也支持ES6,不過只實現了ES6 的部分特性和功能。在ES6之前,對象不是基于類創建的,而是用一種稱為構建函數的特殊函數來定義對象和它們的特征。

創建對象可以通過以下三種方式:

  • 對象字面量
var obj = {// 屬性名 :屬性值// 鍵值對// 成員name : '張三豐',age : 22,sex : '男',lanqiu : function () {console.log('打籃球');}};// obj.keyvar wahahaobj = {}// console.log( obj );// console.log( obj.lanqiu );// console.log( obj.age );// obj.lanqiu();// console.log( obj.name );// console.log( obj['name'] );// 遍歷對象for ( var key in obj ) {console.log( obj[key] );// console.log( obj.key );}
  • new Object()【構造函數】
構造函數也是函數,只不過用法不同,需要和new一起使用才有意義,就可以new出來一個對象// 構造函數創建對象var o = new Object();// console.log( o instanceof Object );// console.log( n instanceof Array );// console.log( o );// 添加屬性// 設置:對象.屬性名 = 值;o.uname = '李尋歡';o.age = 22;o.fei = function () {console.log('’飛飛飛');};// console.log( o.uname );// o.fei();
  • 自定義構造函數
function Person (uname, age) {this.uname = uname;this.age = age;this.chang = function () {console.log('change');}
}// var obj = new Person();// console.log(obj);var obj = new Person('假冰冰', 22);console.log( obj );var obj1 = new Person('劉德華', 17);console.log(obj1);
課件練習:自定義一個構造函數,可以new出一個對象,屬性:姓名,年齡,性別,武器方法:打人,逃跑function Hero (uname, age, sex, weapon) {this.uname = uname;this.age = age;this.sex = sex;this.weapon = weapon;// 方法this.gongji = function () {console.log('打打打');}this.pao = function () {console.log('跑跑跑,趕緊跑eqdfabcdf連氣泡');}}// 實例化var hz = new Hero('皇子', 16, '男', '矛');// console.log( hz );console.log( hz.uname );hz.pao();

工廠模式

構造函數和原型

構造函數是一種特殊的函數,主要用來初始化對象,即為對象成員變量賦初始值,它總與new一起使用。我們可以把對象中一些公共的屬性和方法抽取出來,然后封裝到這個函數里面。function Fn () {}

在JS 中,使用構造函數時要注意以下兩點:

1.構造函數用于創建某一類對象,其首字母要大寫

2.構造函數要和new 一起使用才有意義

練習判斷構造函數還是普通函數在使用的時候查看是否與new結合使用

new在執行時會做四件事情

  1. 在內存中創建一個新的空對象。
  2. 讓this指向這個新的對象。
  3. 執行構造函數里面的代碼,給這個新對象添加屬性和方法。
  4. 返回這個新對象(所以構造函數里面不需要return)。

靜態成員和實例成員

JavaScript 的構造函數中可以添加一些成員,可以在構造函數本身上添加,也可以在構造函數內部的this 上添加。通過這兩種方式添加的成員,就分別稱為靜態成員和實例成員。
  • 靜態成員:在構造函數本上添加的成員稱為靜態成員,只能由構造函數本身來訪問
  • 實例成員:在構造函數內部創建的對象成員稱為實例成員,只能由實例化的對象來訪問
function Person (uname, age) {this.uname = uname;this.age = age;this.say = function () {console.log(123);}}var obj = new Person('張三豐',22);	console.log(obj.uname);// console.log( Person.uname );Person.leibie = '人';console.log(Person.leibie);console.log(obj.leibie);

? ES6:字面量,構造函數,自定義構造函數

? new執行過程:1.創建空對象,2.this指向這個對象,3.指向函數里面的代碼,4.返回這個對象

? 成員:靜態成員【Star.sex = ‘男’】,實例成員【function Star () {成員}】

構造函數小問題:

當實例化對象的時候,屬性好理解,屬性名屬性值,那么方法是函數,函數是復雜數據類型那么保存的時候是保存地址,又指向函數,而每創建一個對象,都會有一個函數,每個函數都得開辟一個內存空間,此時浪費內存了,那么如何節省內存呢,我們需要用到原型方法放到構造函數里面,如果多次實例化,會浪費內存
function Star (uname, age) {this.uname = uname;this.age = age;this.sing = function () {console.log(this.name + '在唱歌');}
}var ldh = new Star('周星馳', 22);
var ldh = new Star('劉德華', 22);

在這里插入圖片描述

構造函數原型prototype

什么是原型對象:就是一個屬性,是構造函數的屬性,這個屬性是一個對象,我們也稱呼,prototype 為原型對象。

每一個構造函數都有一個屬性,prototype

作用:是為了共享方法,從而達到節省內存

注意:每一個構造函數都有prototype屬性

例如:大家來學校上學,有的開車,有的汽車,有的開飛機,等等,此時浪費,那么準備一個大巴車,方便有節省

構造函數通過原型分配的函數是所有對象所共享的。

JavaScript 規定,每一個構造函數都有一個prototype 屬性,指向另一個對象。注意這個prototype 就是一個對象,這個對象的所有屬性和方法,都會被構造函數所擁有。我們可以把那些不變的方法,直接定義在prototype 對

象上,這樣所有對象的實例就可以共享這些方法。

function Star (uname, age) {this.uname = uname;this.age = age;// this.sing = function () {// 	console.log(this.name + '在唱歌');// }}Star.prototype.sing = function () {console.log(this.uname + '在唱歌');}var zxc = new Star('周星馳', 22);var ldh = new Star('劉德華', 22);// console.log( Star.prototype );ldh.sing();zxc.sing();

總結:所有的公共屬性寫到構造函數里面,所有的公共方法寫到原型對象里面

疑問:為何創建一個對象,都可以自動的跑到原型對象上找方法

因為每一個對象都有一個屬性,對象原型,執行原型對象

對象原型:proto

主要作用:指向prototype

構造函數和原型對象都會有一個屬性____proto____ 指向構造函數的prototype 原型對象,之所以我們對象可以使用構造函數prototype 原型對象的屬性和方法,就是因為對象有__proto__ 原型的存在。

注意:____proto____是一個非標準屬性,不可以拿來賦值或者設置【只讀屬性】
  • 1.____proto____對象原型和原型對象prototype 是等價的2.____proto____對象原型的意義就在于為對象的查找機制提供一個方向,或者說一條路線,但是它是一個非標準屬性,因此實際開發中,不可以使用這個屬性,它只是內部指向原型對象prototype
    

在這里插入圖片描述

總結:每一個對象都有一個原型,作用是指向原型對象prototype

統一稱呼:____proto____原型,prototype成為原型對象

在這里插入圖片描述

每一個構造函數都有一個:prototype【原型對象】(作用:存方法)每一個對象都有一個:__proto__對象原型,(作用:指向prototype)

constructor 構造函數

記錄是哪個構造函數創建出來的

指回構造函數本身

原型(proto)和構造函數(prototype)原型對象里面都有一個屬性constructor屬性,constructor 我們稱為構造函數,因為它指回構造函數本身。constructor 主要用于記錄該對象引用于哪個構造函數,它可以讓原型對象重新指向原來的構造函數。一般情況下,對象的方法都在構造函數的原型對象中設置。如果有多個對象的方法,我們可以給原型對象采取對象形式賦值,但是這樣就會覆蓋構造函數原型對象原來的內容,這樣修改后的原型對象constructor 就不再指向當前構造函數了。此時,我們可以在修改后的原型對象中,添加一個constructor 指向原來的構造函數。

總結:constructor 主要作用可以指回原來的構造函數

構造函數、實例、原型對象三者之間的關系

在這里插入圖片描述

1、每個構造函數都有一個屬性:prototype(原型對象),作用:存方法節省內存

2、每個對象都有一個屬性:proto(對象原型),作用:指向prototype

3、每個原型對象都有一個屬性:constructor,作用:指回構造函數本身

思考:如果傳入一個對象給原型對象添加方法呢

Star.prototype = {sing : function () {},dance: function () {}
};此時會覆蓋原先prototype中的內容,傳入一個新的對象,那么此時就不知道構造函數是哪個了
所以我們要指回構造函數:constructor:構造函數

課程回顧:

? 1、創建對象:字面量,構造函數,自定義構造函數

? 2、new執行過程:創建新對象,this指向這個對象,執行代碼,返回這個對象

? 3、靜態成員實例成員:

? 構造函數身上的成員,稱為靜態成員,只能由構造函數去訪問

? 構造函數內部的成員,稱為實例成員,只能由實例對象去訪問

? 4、原型對象:構造函數的一個屬性,prototype(原型對象),作用:存方法省內存

? 5、對象原型:對象的一個屬性(proto),作用:指向prototype

? 6、構造函數:constructor,作用:指回構造函數本身

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248148.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248148.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248148.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

操作系統原理之文件系統(第五章)

一、文件 1、?件系統的?戶接?包括?件的命名、類型、屬性和對?件的操作 2、?件命名:所有操作系統都允許?1~8個字?組成的字符串 3、?件擴展名:多數操作系統都?持?件名?圓點隔開分為兩部分,圓點后?的部分稱為?件擴展名…

第三次作業------52李金鎮

---恢復內容開始--- 習題1: **1.初始化一個數據集,包括5-10位同學的成績數據(數據類型不限),數據格式如下: **學號 姓名 Java C語言 Python2017XXXX 小白 87 68 922017XXXX 小黃 80 76 832017XXXX 小王 75 …

js高級第三天

原型鏈 作用:提供一個成員的查找機制,或者查找規則含義:由原型所串聯起來的鏈裝結構JavaScript 的成員查找機制(規則) 當訪問一個對象的屬性(包括方法)時,首先查找這個對象自身有沒有該屬性。如果沒有就查…

為什么大學的計算機老師技術那么厲害,卻不愿意當程序員?

不知道大家有多少是從事跟計算機有關的工作的,每次想到大學時的計算機考試,都能令小小編心驚膽戰呀,各式代碼和計算機語言,真的是很令人頭痛了。不過呢,也有很多大神,大學學著其他的專業,卻在畢…

DDG全家桶之3022

本篇文章主要根據360Netlab新出的DDG分析文檔來復現新變種3022,會涉及部分分析和清除的方法,本篇文章只用于學習交流,為廣大受害者提供清除思路 ,請勿用于非法用途,產生一切后果與作者無關 詳情請參考文檔:…

js高級第四天

課程回顧: ? 原型鏈:由原型構成鏈狀結構,提供成員查找機制 ? 繼承:組合繼承:構造函數和原型對象 ? 屬性:調用父構造函數的時候用call改變this指向 ? 方法:父實例對象賦值給子原型對象&a…

d3.js 制作簡單的俄羅斯方塊

d3.js是一個不錯的可視化框架,同時對于操作dom也是十分方便的。今天我們使用d3.js配合es6的類來制作一個童年小游戲--俄羅斯方塊。話不多說先上圖片。 1. js tetris類 由于方法拆分的比較細所以加上了一些備注(這不是我的風格!) c…

Flask中路由系統以及藍圖的使用

一、Flask的路由系統 1.app.route()裝飾器中的參數 methods:當前URL地址,允許訪問的請求方式 app.route("/info", methods["GET", "POST"]) def student_info():stu_id int(request.args["id"])return f"Hello Old b…

js高級第五天

課程回顧: ? 原型鏈:由原型構成鏈狀結構,提供成員查找機制 ? 繼承:組合繼承:構造函數和原型對象 ? 屬性:調用父構造函數的時候用call改變this指向 ? 方法:父實例對象賦值給子原型對象&a…

d3.js 制作簡單的貪吃蛇

d3.js是一個不錯的可視化框架,同時對于操作dom也是十分方便的。今天我們使用d3.js配合es6的類來制作一個童年小游戲–貪吃蛇。話不多說先上圖片。 1. js snaker類 class Snaker {constructor() {this._size 30;this._len 3;this._width 900;this._height 690;th…

js高級第六天

Q課程回顧: ? 閉包:有權訪問另外一個函數的局部變量的函數,作用:延伸變量使用范圍 ? mdn,w3c function fn1 () {var n 3;return function () {console.log(n);} }? 遞歸:函數調用其本身 function f…

Chrome 75 lazy-loading

Chrome 75 & lazy-loading https://addyosmani.com/blog/lazy-loading/ https://chromestatus.com/feature/5645767347798016 Chrome 75 將默認啟用延遲加載功能 自 Chrome 75 起&#xff0c;將原生支持圖片的延遲加載&#xff0c;在代碼中編寫 <img loading"lazy&…

d3.js 實現煙花鮮果

今天在d3.js官網上看到了一個煙花的DEMO&#xff0c;是canvas制作的&#xff0c;于是我想用d3.js來實現它&#xff0c;js代碼只有幾行。好了廢話不多說&#xff0c;先上圖。 1 js 類 因為煙花要有下落的效果&#xff0c;所以里面用到了一些簡單的數學和物理知識來模擬重力&…

阿里Sentinel控制臺源碼修改-對接Apollo規則持久化

改造背景 前面我們講解了如何對接Apollo來持久化限流的規則&#xff0c;對接后可以直接通過Apollo的后臺進行規則的修改&#xff0c;推送到各個客戶端實時生效。 但還有一個問題就是Sentinel控制臺沒有對接Apollo&#xff0c;Sentinel控制臺本來就可以修改限流的規則&#xff0…

第八節:EF Core連接MySql和Sqlite數據庫

。。。 轉載于:https://www.cnblogs.com/yaopengfei/p/11507557.html

Flask--WebSocket

flask websocket websocket原理 Socket&#xff1a; FTP - 文件服務 Django Flask Http - TCP: 1.一次請求 一次響應 斷開 2.客戶端永遠處于主動狀態 3.服務器永遠處于被動狀態 4.Http無狀態 - 在服務器不保存客戶端的信息 5.服務器無法主動找到客戶端 1.輪詢 客戶端向服務器…

jQuery第一天

課程回顧&#xff1a; ? 正則&#xff1a;匹配字符組合模式; ? 創建&#xff1a;var reg1 new RegExp(/abc/); var reg2 /abc/; ? 測試&#xff1a;reg1.test(‘abc’); ? 特殊字符&#xff1a;元字符 ? 邊界符&#xff1a;^&#xff0c;$ ? 字符類&#xff1a;[…

Python學習(一)

一、版本&#xff1a; Python2.X /Python3.x 官方宣布2020 年 1 月 1 日&#xff0c; 停止 Python 2 的更新。 Python3.x不兼容Python2.x  二、安裝&#xff08;以mac 為例&#xff09; MAC 系統一般都自帶有 Python2.x版本 的環境&#xff0c;你也可以在鏈接 https://www.py…

jQuery—淘寶精品服飾案例

<body><div class"wrapper"><ul id"left"><li><a href"#">女靴</a></li><li><a href"#">雪地靴</a></li><li><a href"#">冬裙</a>&l…

Python機器學習實踐:決策樹判別汽車金融違約用戶

文章發布于公號【數智物語】 &#xff08;ID&#xff1a;decision_engine&#xff09;&#xff0c;關注公號不錯過每一篇干貨。 轉自 | 法納斯特&#xff08;公眾號ID:walker398&#xff09; 作者 | 小F 決策樹呈樹形結構&#xff0c;是一種基本的回歸和分類方法。 決策樹模型的…