解析Object.defineProperty的作用

vue.js的双向数据绑定就是通过Object.defineProperty方法实现的,俗称属性拦截器。

接下来看一下Object.defineProperty使用方式:

Object.defineProperty(obj, prop, descriptor)
obj:必需。目标对象
prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特性
当修改或定义对象的某个属性的时候,给这个属性添加一些特性:

一、访问器属性

访问器属性是对象中的一种特殊属性,它不能直接在对象中设置,而必须通过 defineProperty() 方法单独定义。

var obj = { };

为obj定义一个名为 hello 的访问器属性

Object.defineProperty(obj, "hello", {

  get: function () {return sth},

  set: function (val) { do sth;}

})

obj.hello 可以像普通属性一样读取访问器属性

访问器属性的"值"比较特殊,读取或设置访问器属性的值,实际上是调用其内部特性:get和set函数。

obj.hello 读取属性,就是调用get函数并返回get函数的返回值

obj.hello = "abc" 为属性赋值,就是调用set函数,赋值其实是传参

get 和 set 方法内部的 this 都指向 obj,这意味着 get 和 set 函数可以操作对象内部的值。另外,访问器属性的会"覆盖"同名的普通属性,因为访问器属性会被优先访问,与其同名的普通属性则会被忽略。

实例:

HTML:<!DOCTYPE html>

<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
  <input type="text" id="input"/>
  <span id="binding"></span>

</body></html>

JS:

var obj = {};

Object.defineProperty(obj,‘hello‘,{
  set:function(val){
      document.getElementById(‘binding‘).innerHTML = val;
      document.getElementById(‘input‘).value = val;
  }
});
document.getElementById(‘input‘).oninput=function(e){
      obj.hello = e.target.value;
}
obj.hello = "";

原文地址:https://www.cnblogs.com/yscode/p/9821690.html

时间: 2024-11-12 18:58:59

解析Object.defineProperty的作用的相关文章

《转》理解Object.defineProperty的作用

对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = "张三"; //添加描述 obj.say = function(){}; //添加行为 除了以上添加属性的方式,还可以使用Object.defineProperty定义新属性或修改原有的属性. Object.defineProperty() 语法: Object.definePropert

理解Object.defineProperty的作用

对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = "张三"; //添加描述 obj.say = function(){}; //添加行为 除了以上添加属性的方式,还可以使用Object.defineProperty定义新属性或修改原有的属性. Object.defineProperty() 语法: Object.definePropert

[转] 理解Object.defineProperty的作用

对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值.定义对象可以使用构造函数或字面量的形式: var obj = new Object; //obj = {} obj.name = "张三"; //添加描述 obj.say = function(){}; //添加行为 除了以上添加属性的方式,还可以使用Object.defineProperty定义新属性或修改原有的属性. Object.defineProperty() 语法: Object.definePropert

解析神奇的 Object.defineProperty

这个方法了不起啊..vue.js是通过它实现双向绑定的..而且Object.observe也被草案发起人撤回了..所以defineProperty更有必要了解一下了. 几行代码看他怎么用 var a= {} Object.defineProperty(a,"b",{ value:123 }) console.log(a.b);//123 很简单,它接受三个参数,而且都是必填的.. 传入参数 第一个参数:目标对象 第二个参数:需要定义的属性或方法的名字. 第三个参数:目标属性所拥有的特性

解析 神奇的 Object.defineProperty

这个方法了不起啊..vue.js和avalon.js 都是通过它实现双向绑定的..而且Object.observe也被草案发起人撤回了..所以defineProperty更有必要了解一下了几行代码看他怎么用 var a= {} Object.defineProperty(a,"b",{ value:123 }) console.log(a.b);//123 很简单,,它接受三个参数,而且都是必填的.. 传入参数 第一个参数:目标对象 第二个参数:需要定义的属性或方法的名字. 第三个参数

16、前端知识点--Object.defineProperty 的用法+双向数据绑定原理解析

一.Object.defineProperty 的用法 Object.defineProperty 可以用于给对象添加更新属性. <script> // Object.defineProperty可以用于给对象添加或更新属性. // 它里面有下面三个参数: 给设置属性的对象.设置属性的属性名.以及设置的配置项 // 先声明的一个对象 var obj = {} Object.defineProperty(obj,"name",{ // 这个配置项里面有两个函数,分别是gett

双向数据绑定实现之Object.defineProperty

vue.js利用的是es5的 defineproperty 特性实现的双向数据绑定,了解一下基本原理. 举例 var person= {}; Object.defineProperty(person, "name", { value: '张三' }) console.log(person.name); // 张三 传参 第一个参数:要设置的目标对象(必填) 第二个参数:需要定义的属性或方法的名称(必填) 第三个参数:目标属性所拥有的特性.(descriptor)(必填) 三个参数都是必

深入理解 Object.defineProperty

Object.defineProperty() 和 Proxy 对象,都可以用来对数据的劫持操作.何为数据劫持呢?就是在我们访问或者修改某个对象的某个属性的时候,通过一段代码进行拦截行为,然后进行额外的操作,然后返回结果.那么vue中双向数据绑定就是一个典型的应用. Vue2.x 是使用 Object.defindProperty(),来进行对对象的监听的.Vue3.x 版本之后就改用Proxy进行实现的.下面我们先来理解下Object.defineProperty作用. 一: 理解Object

Js中的Object.defineProperty

通过Object.defineProperty为对象设置属性,并同时规定属性的属性(可见性,可配置性,可枚举性等) 备注:如果通过var obj = {} obj.age = 18这种方式设置的属性,他的可见性,可配置性,可枚举性等都为true,相当于默认设置了本篇讨论的各种属性都为true 语法:Object.defineProperty(obj, prop, descriptor) 第一个参数:目标对象第二个参数:需要定义的属性或方法的名字.第三个参数:目标属性所拥有的特性.(descrip