OK,这一篇主要想说一下Object.defineProperty这个方法。
var p1 ={
name:"lisi", }
那我们Object.defineProperty这个方法有什么用呢?
Object.defineProperty(p1,"name",{
configurable : false, }) console.log(p1); //{ name: 'lisi' } delete p1.name; console.log(p1); //{ name: 'lisi' }
通过这个方法设置好configurable 这个属性,delete就不能把name属性给删除掉了。
Object.defineProperty(p1,"age",{
writable :false, value : 15, }) console.log(p1.age); //15 p1.age = 20; console.log(p1.age); //15
Object.defineProperty(p1,"age",{
enumerable:false }) for(var i in p1){
console.log(p1[i]); } // lisi
在通过这个方法给enumerable设置为false,这样对象就不能通过迭代器遍历出age这个属性的值了。
1.get:在读取属性时调用的函数,默认值是undefined
2..set:在写入属性的时候调用的函数,默认值是undefined
现在我们来用这两个方法来实践一下:
var book = {
_year : 2004, edition : 1 } Object.defineProperty(book,"year",{
get: function(){
return this._year }, set: function(newYear){
if(newYear > 2004){
this._year = newYear; this.edition += newYear - 2004 } } }) book.year = 2005; console.log(book.edition); // 2 console.log(book._year); //2005
最后我们再说一下如何进行定义多个属性
var student = {
}; Object.defineProperties(student,{
name:{
writable:false, value:"lisi" }, age : {
writable:true, value : 16, }, sex:{
get(){
return '男'; }, set(v){
p1.sex = v } } }) p1.sex = "男"; console.log(student.name + ":" + student.age); console.log(p1.sex); // 男 student.sex = "女"; console.log(student.sex); //男 console.log(p1.sex); // 女
OK,关于写法应该也没有什么难点。
最后我在附上一个模拟Vue中v-module数据双向绑定原理的代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <style> #myInput {
width: 400px; height: 50px; font-size: 40px; color: red; } #contain {
margin-top: 20px; width: 400px; height: 200px; border: 1px solid salmon; } </style> </head> <body> <input id="myInput" type="text" /> <div id="contain"></div> <script> var text; window.data = {
}; var oIn = document.getElementById("myInput"); var oDiv = document.getElementById("contain"); oIn.addEventListener("input", function (e) {
text = e.target.value; console.log(text); window.data.value = text; }); Object.defineProperty(window.data, "value", {
get() {
return ""; }, set(v) {
oDiv.innerHTML = v; }, }); </script> </body> </html>
那关于这一部分的知识也就整理完啦!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201340.html原文链接:https://javaforall.net
