摘要:枚舉對(duì)象屬性列舉的可枚舉屬性,包括自身和原型鏈上的只列舉對(duì)象本身的可枚舉屬性創(chuàng)建對(duì)象的幾種方式對(duì)象字面量通過構(gòu)造函數(shù)以指定的對(duì)象作為原型來創(chuàng)建對(duì)象這樣,的原型就是了如何判斷對(duì)象是否是空對(duì)象對(duì)象屬性的描述符屬性的描述符分描述符和訪問描述符,對(duì)
枚舉對(duì)象屬性
for....in
列舉obj的可枚舉屬性,包括自身和原型鏈上的
object.keys()
只列舉對(duì)象本身的可枚舉屬性
創(chuàng)建對(duì)象的幾種方式
對(duì)象字面量
const pre="test" const obj= { "name":"luyun", [pre+"prop"]:"wu shuang lian quan" }
通過構(gòu)造函數(shù)
const obj= new Object() const d = new Date()
Object.create()
以指定的對(duì)象作為原型來創(chuàng)建對(duì)象
var Animal = { type: "Invertebrates", // Default value of properties displayType: function() { // Method which will display type of Animal console.log(this.type); } }; var animal1 = Object.create(Animal); //這樣,animal1的原型就是Animal了
如何判斷對(duì)象是否是空對(duì)象
typeof {} == "object" Object.keys({}).length===0
對(duì)象屬性的描述符
屬性的描述符分data描述符和訪問描述符,對(duì)一個(gè)屬性來說,只能存在一種描述符,configurable、enumerable是公共的。
const users={ a:"luyun" } Object.getOwnPropertyDescriptor( users, "a" ); //數(shù)據(jù)描述符 // { // value: 2, // writable: true, // enumerable: true, // configurable: true // }
writeable 是否可以修改
enumable 是否可枚舉,出現(xiàn)在 for in 中
configurable 是否可通過defineProperty()來修改描述符,為false時(shí),屬性不能刪除
Getter、Setter
當(dāng)你給一個(gè)屬性定義getter、setter或者兩者都有時(shí),這個(gè)屬性會(huì)被定義為“訪問描述符”(和“數(shù)據(jù)描
述符”相對(duì))
const users={ "name":"luyun" } Object.defineProperty(users,"kongfu",{ get:function(){ return "正十七" }, enumerable:true })
簡(jiǎn)單模擬基于數(shù)據(jù)劫持的數(shù)據(jù)綁定
思考:
劫持的數(shù)據(jù)是用來綁定到模板上的 | {{ }} ng-bind
怎么綁定,定義watcher監(jiān)聽表達(dá)式值的變化,渲染dom
數(shù)據(jù)變了,怎么通知watcher更新模 | setter劫持
誰來通知watcher | 發(fā)布訂閱模式
首先封裝Object.defineProperty監(jiān)聽屬性的變化
function observe(data) { const keys = Object.keys(data) keys.forEach(key => { gs(data, key, data[key]) }) } //劫持?jǐn)?shù)據(jù) function gs(obj, key, val) { let originVal = val const subpub = new Subpub() Object.defineProperty(obj, key, { configurable: true, enumerable: true, get() { //這里應(yīng)該確定訂閱者是誰 Subpub.target && subpub.addWatcher() return originVal }, set(value) { originVal = value //訂閱了當(dāng)前屬性的都要更新 subpub.notice() } }) }
發(fā)布訂閱,需要知道哪些地方用到了當(dāng)前屬性的值,在屬性值變化時(shí),要更新這些地方
function Subpub() { this.subList = [] //保存訂閱某個(gè)屬性的訂閱者 } Subpub.prototype.addSub = function (watcher) { this.subList.push(watcher) } //通知訂閱者們,數(shù)據(jù)變化了,你們要各自行動(dòng)了 Subpub.prototype.notice = function () { this.subList.forEach(item => { item.render() }) } Subpub.prototype.addWatcher = function () { Subpub.target.addSubpub(this) }
function Watcher(exp, fn) { Subpub.target = this this.exp = exp //監(jiān)聽的屬性的初始值 this.value = user[exp] //這里寫死的user,應(yīng)該是當(dāng)前環(huán)境下的數(shù)據(jù),比如angular中$scope this.fn = fn Subpub.target = null } Watcher.prototype.render = function () { const oldValue = this.value const newValue = user[this.exp] this.fn(newValue, oldValue) } Watcher.prototype.addSubpub = function (subpub) { subpub.addSub(this) }
const user = { name: "初始的盧云", kongfu: "無" } observe(user) //這里只是簡(jiǎn)單的打印新值 new Watcher("name", function (newVal,old) { console.log(old) console.log(newVal) }) new Watcher("kongfu", function (newVal) { console.log(newVal) }) user.name = "后來的盧云" user.kongfu=["無雙連拳","正十七", "無絕心法"] //設(shè)置name,kongfu后的輸出: > 初始的盧云 后來的盧云 [ "無雙連拳", "正十七", "無絕心法" ]
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/88593.html
摘要:創(chuàng)建對(duì)象對(duì)象直接量構(gòu)造函數(shù)原型繼承類繼承對(duì)象擁有自有屬性和繼承屬性。遍歷順序是以廣度優(yōu)先遍歷所以使用便可以判斷是否是對(duì)象自有的屬性。可執(zhí)行對(duì)象通過如下方法可以創(chuàng)建一個(gè)可執(zhí)行對(duì)象既可以當(dāng)作對(duì)象來使用有原型鏈,也可以當(dāng)作函數(shù)來直接調(diào)用 原文: http://pij.robinqu.me/Javascript_Core/Javascript_Basics/Objects.html ...
摘要:標(biāo)簽前端作者更多文章個(gè)人網(wǎng)站 Learning Notes - Understanding the Weird Parts of JavaScript 標(biāo)簽 : 前端 JavaScript [TOC] The learning notes of the MOOC JavaScript: Understanding the Weird Parts on Udemy,including...
摘要:但好在還給我們提供了一個(gè)方法,每一個(gè)對(duì)象都有這樣一個(gè)方法,專門用來判斷某個(gè)屬性是否是該對(duì)象的私有屬性。如果你想要用對(duì)象字面形式,你只能在創(chuàng)建對(duì)象時(shí)定義訪問器屬性。在中,我們使用凍結(jié)一個(gè)對(duì)象,并且使用來判斷一個(gè)對(duì)象是否被凍結(jié)。 說完了對(duì)象那些不常用的冷知識(shí),是時(shí)候來看看JavaScript中對(duì)象屬性有哪些有意思的東西了。 不出你所料,對(duì)象屬性自然也有其相應(yīng)的特征屬性,但是這個(gè)話題有點(diǎn)復(fù)雜...
摘要:的這種實(shí)現(xiàn)方式導(dǎo)致了一些尷尬問題,比如刪除元素元素遍歷。后面的參數(shù)被忽略掉了,表示并沒有要插入的元素。其實(shí),的本質(zhì)是跟蹤中的,并始終保持值是。這時(shí)候,雖然不大可能,可能會(huì)在中間某個(gè)中被用戶重新定義。但是在上進(jìn)行這種操作是很糟糕的。 在Javascript中,array是一個(gè)類數(shù)組的object。顧名思義,它能夠在一個(gè)變量上存儲(chǔ)多個(gè)值。 數(shù)組是值的有序集合。每個(gè)值叫做一個(gè)元素,而每個(gè)元素...
摘要:對(duì)象是的數(shù)據(jù)類型。對(duì)象是動(dòng)態(tài)的,可以隨時(shí)新增和刪除自有屬性。客戶端中表示網(wǎng)頁結(jié)構(gòu)的對(duì)象均是宿主對(duì)象。提供第二個(gè)可選參數(shù),用以對(duì)對(duì)象的屬性進(jìn)行進(jìn)一步描述。沒有原型的對(duì)象為數(shù)不多,就是其中之一。運(yùn)算符的左側(cè)是屬性名字符串,右側(cè)是對(duì)象。 對(duì)象是 JavaScript 的數(shù)據(jù)類型。它將很多值(原始值或者其他對(duì)象)聚合在一起,可通過名字訪問這些值,因此我們可以把它看成是從字符串到值的映射。對(duì)象是...
摘要:屬性名可以是包含空字符串在內(nèi)的任意字符串,但對(duì)象中不能存在兩個(gè)同名的屬性。客戶端中表示網(wǎng)頁結(jié)構(gòu)的對(duì)象均是宿主對(duì)象。這里的函數(shù)稱做構(gòu)造函數(shù),構(gòu)造函數(shù)用以初始化一個(gè)新創(chuàng)建的對(duì)象。通過關(guān)鍵字和構(gòu)造函數(shù)調(diào)用創(chuàng)建的對(duì)象的原型就是構(gòu)造函數(shù)的屬性的值。 對(duì)象是 JavaScript 的數(shù)據(jù)類型。它將很多值(原始值或者其他對(duì)象)聚合在一起,可通過名字訪問這些值,因此我們可以把它看成是從字符串到值的映射...
閱讀 1135·2021-09-22 15:32
閱讀 1731·2019-08-30 15:53
閱讀 3263·2019-08-30 15:53
閱讀 1418·2019-08-30 15:43
閱讀 461·2019-08-28 18:28
閱讀 2576·2019-08-26 18:18
閱讀 676·2019-08-26 13:58
閱讀 2535·2019-08-26 12:10