Hướng dẫn flag in javascript - cờ trong javascript

Như chúng ta biết, các đối tượng có thể lưu trữ các thuộc tính.

Cho đến bây giờ, một thuộc tính là một cặp khóa-giá trị đơn giản. Nhưng một thuộc tính đối tượng thực sự là một thứ linh hoạt và mạnh mẽ hơn.

Trong chương này, chúng ta sẽ nghiên cứu các tùy chọn cấu hình bổ sung và trong phần tiếp theo chúng ta sẽ xem làm thế nào để vô hình biến chúng thành các hàm getter / setter.

  • 1. Các cờ[flags] của một thuộc tính cờ
  • 2. Non-writable
  • 3. Non-enumerable
  • 4. Non-configurable
  • 5. Object.defineProperies
  • 6. Object.getOwnPropertyDescriptors
  • 7. Niêm phong một đối tượng trên toàn cầu

Các thuộc tính đối tượng, ngoài một

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
6, có ba thuộc tính đặc biệt [còn gọi là cờ – Flag]:
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
6
, có ba thuộc tính đặc biệt [còn gọi là cờ – Flag]:

  • /*
    Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
    @author cafedevn
    Contact: 
    Fanpage: //www.facebook.com/cafedevn
    Instagram: //instagram.com/cafedevn
    Twitter: //twitter.com/CafedeVn
    Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
    */
    
    let user = {
      name: "John"
    };
    
    let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];
    
    alert[ JSON.stringify[descriptor, null, 2 ] ];
    /* property descriptor:
    {
      "value": "John",
      "writable": true,
      "enumerable": true,
      "configurable": true
    }
    */
    7– nếu
    /*
    Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
    @author cafedevn
    Contact: 
    Fanpage: //www.facebook.com/cafedevn
    Instagram: //instagram.com/cafedevn
    Twitter: //twitter.com/CafedeVn
    Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
    */
    
    let user = {
      name: "John"
    };
    
    let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];
    
    alert[ JSON.stringify[descriptor, null, 2 ] ];
    /* property descriptor:
    {
      "value": "John",
      "writable": true,
      "enumerable": true,
      "configurable": true
    }
    */
    8, giá trị có thể được thay đổi, nếu không thì chỉ đọc.
    – nếu
    /*
    Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
    @author cafedevn
    Contact: 
    Fanpage: //www.facebook.com/cafedevn
    Instagram: //instagram.com/cafedevn
    Twitter: //twitter.com/CafedeVn
    Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
    */
    
    let user = {
      name: "John"
    };
    
    let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];
    
    alert[ JSON.stringify[descriptor, null, 2 ] ];
    /* property descriptor:
    {
      "value": "John",
      "writable": true,
      "enumerable": true,
      "configurable": true
    }
    */
    8, giá trị có thể được thay đổi, nếu không thì chỉ đọc.
  • /*
    Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
    @author cafedevn
    Contact: 
    Fanpage: //www.facebook.com/cafedevn
    Instagram: //instagram.com/cafedevn
    Twitter: //twitter.com/CafedeVn
    Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
    */
    
    let user = {
      name: "John"
    };
    
    let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];
    
    alert[ JSON.stringify[descriptor, null, 2 ] ];
    /* property descriptor:
    {
      "value": "John",
      "writable": true,
      "enumerable": true,
      "configurable": true
    }
    */
    9– nếu
    /*
    Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
    @author cafedevn
    Contact: 
    Fanpage: //www.facebook.com/cafedevn
    Instagram: //instagram.com/cafedevn
    Twitter: //twitter.com/CafedeVn
    Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
    */
    
    let user = {
      name: "John"
    };
    
    let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];
    
    alert[ JSON.stringify[descriptor, null, 2 ] ];
    /* property descriptor:
    {
      "value": "John",
      "writable": true,
      "enumerable": true,
      "configurable": true
    }
    */
    8, sau đó được liệt kê trong các vòng lặp, nếu không thì không được liệt kê.
    – nếu
    /*
    Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
    @author cafedevn
    Contact: 
    Fanpage: //www.facebook.com/cafedevn
    Instagram: //instagram.com/cafedevn
    Twitter: //twitter.com/CafedeVn
    Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
    */
    
    let user = {
      name: "John"
    };
    
    let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];
    
    alert[ JSON.stringify[descriptor, null, 2 ] ];
    /* property descriptor:
    {
      "value": "John",
      "writable": true,
      "enumerable": true,
      "configurable": true
    }
    */
    8, sau đó được liệt kê trong các vòng lặp, nếu không thì không được liệt kê.
  • Object.defineProperty[obj, propertyName, descriptor]
    1– nếu
    /*
    Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
    @author cafedevn
    Contact: 
    Fanpage: //www.facebook.com/cafedevn
    Instagram: //instagram.com/cafedevn
    Twitter: //twitter.com/CafedeVn
    Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
    */
    
    let user = {
      name: "John"
    };
    
    let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];
    
    alert[ JSON.stringify[descriptor, null, 2 ] ];
    /* property descriptor:
    {
      "value": "John",
      "writable": true,
      "enumerable": true,
      "configurable": true
    }
    */
    8, thuộc tính có thể bị xóa và các thuộc tính này có thể được sửa đổi, nếu không thì không.
    – nếu
    /*
    Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
    @author cafedevn
    Contact: 
    Fanpage: //www.facebook.com/cafedevn
    Instagram: //instagram.com/cafedevn
    Twitter: //twitter.com/CafedeVn
    Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
    */
    
    let user = {
      name: "John"
    };
    
    let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];
    
    alert[ JSON.stringify[descriptor, null, 2 ] ];
    /* property descriptor:
    {
      "value": "John",
      "writable": true,
      "enumerable": true,
      "configurable": true
    }
    */
    8, thuộc tính có thể bị xóa và các thuộc tính này có thể được sửa đổi, nếu không thì không.

Chúng ta chưa nhìn thấy chúng, vì nhìn chung chúng không xuất hiện. Khi chúng ta tạo một thuộc tính theo cách thông thường, thì tất cả đều

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
8. Nhưng chúng ta cũng có thể thay đổi chúng bất cứ lúc nào.

Trước tiên, hãy xem làm thế nào để có được những flag.

Phương thức Object.getOwnPropertyDescriptor cho phép truy vấn thông tin đầy đủ về một thuộc tính.

Cú pháp là:

let descriptor = Object.getOwnPropertyDescriptor[obj, propertyName];

Object.defineProperty[obj, propertyName, descriptor]
4

Các đối tượng cần có được thông tin từ.

Object.defineProperty[obj, propertyName, descriptor]
5

Tên của thuộc tính.

Giá trị được trả về là một đối tượng được gọi là đối tượng mô tả thuộc tính: có chứa giá trị và tất cả các cờ.

Ví dụ:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/

Để thay đổi các cờ, chúng ta có thể sử dụng Object.defineProperty.

Cú pháp là:

Object.defineProperty[obj, propertyName, descriptor]

Các đối tượng cần có được thông tin từ.

Tên của thuộc tính.

Object.defineProperty[obj, propertyName, descriptor]
8

Giá trị được trả về là một đối tượng được gọi là đối tượng mô tả thuộc tính: có chứa giá trị và tất cả các cờ.

Ví dụ:

Để thay đổi các cờ, chúng ta có thể sử dụng Object.defineProperty.

let user = {};

Object.defineProperty[user, "name", {
  value: "John"
}];

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/*
{
  "value": "John",
  "writable": false,
  "enumerable": false,
  "configurable": false
}
 */

Object.defineProperty[obj, propertyName, descriptor]
4,
Object.defineProperty[obj, propertyName, descriptor]
5

Các đối tượng và thuộc tính của nó để áp dụng mô tả.

2. Non-writableNon-writable

3. Non-enumerable

let user = {
  name: "John"
};

Object.defineProperty[user, "name", {
  writable: false
}];

user.name = "Pete"; // Error: Cannot assign to read only property 'name'

4. Non-configurable

5. Object.defineProperies

6. Object.getOwnPropertyDescriptors

7. Niêm phong một đối tượng trên toàn cầu

let user = { };

Object.defineProperty[user, "name", {
  value: "John",
  // for new properties we need to explicitly list what's true
  enumerable: true,
  configurable: true
}];

alert[user.name]; // John
user.name = "Pete"; // Error

3. Non-enumerableNon-enumerable

4. Non-configurable

5. Object.defineProperies

6. Object.getOwnPropertyDescriptors

7. Niêm phong một đối tượng trên toàn cầu

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John",
  toString[] {
    return this.name;
  }
};

Object.defineProperty[user, "toString", {
  enumerable: false
}];

// Now our toString disappears:
for [let key in user] alert[key]; // name

Các thuộc tính đối tượng, ngoài một

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
6, có ba thuộc tính đặc biệt [còn gọi là cờ – Flag]:

alert[Object.keys[user]]; // name

4. Non-configurableNon-configurable

5. Object.defineProperies

6. Object.getOwnPropertyDescriptors

7. Niêm phong một đối tượng trên toàn cầu

let descriptor = Object.getOwnPropertyDescriptor[Math, 'PI'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/*
{
  "value": 3.141592653589793,
  "writable": false,
  "enumerable": false,
  "configurable": false
}
*/

Các thuộc tính đối tượng, ngoài một

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
6, có ba thuộc tính đặc biệt [còn gọi là cờ – Flag]:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
0

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
7– nếu
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
8, giá trị có thể được thay đổi, nếu không thì chỉ đọc.

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
9– nếu
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
8, sau đó được liệt kê trong các vòng lặp, nếu không thì không được liệt kê.

  1. Object.defineProperty[obj, propertyName, descriptor]
    1– nếu
    /*
    Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
    @author cafedevn
    Contact: 
    Fanpage: //www.facebook.com/cafedevn
    Instagram: //instagram.com/cafedevn
    Twitter: //twitter.com/CafedeVn
    Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
    */
    
    let user = {
      name: "John"
    };
    
    let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];
    
    alert[ JSON.stringify[descriptor, null, 2 ] ];
    /* property descriptor:
    {
      "value": "John",
      "writable": true,
      "enumerable": true,
      "configurable": true
    }
    */
    8, thuộc tính có thể bị xóa và các thuộc tính này có thể được sửa đổi, nếu không thì không.
  2. Chúng ta chưa nhìn thấy chúng, vì nhìn chung chúng không xuất hiện. Khi chúng ta tạo một thuộc tính theo cách thông thường, thì tất cả đều
    /*
    Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
    @author cafedevn
    Contact: 
    Fanpage: //www.facebook.com/cafedevn
    Instagram: //instagram.com/cafedevn
    Twitter: //twitter.com/CafedeVn
    Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
    */
    
    let user = {
      name: "John"
    };
    
    let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];
    
    alert[ JSON.stringify[descriptor, null, 2 ] ];
    /* property descriptor:
    {
      "value": "John",
      "writable": true,
      "enumerable": true,
      "configurable": true
    }
    */
    8. Nhưng chúng ta cũng có thể thay đổi chúng bất cứ lúc nào.
  3. Trước tiên, hãy xem làm thế nào để có được những flag.
  4. Phương thức Object.getOwnPropertyDescriptor cho phép truy vấn thông tin đầy đủ về một thuộc tính.

Cú pháp là:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
1

Các đối tượng cần có được thông tin từ.

Tên của thuộc tính.

Giá trị được trả về là một đối tượng được gọi là đối tượng mô tả thuộc tính: có chứa giá trị và tất cả các cờ.

5. Object.defineProperiesObject.defineProperies

6. Object.getOwnPropertyDescriptors

Cú pháp là:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
2

Ví dụ:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
3

Vì vậy, chúng ta có thể thiết lập nhiều thuộc tính cùng một lúc.

6. Object.getOwnPropertyDescriptorsObject.getOwnPropertyDescriptors

Để có được tất cả các mô tả thuộc tính cùng một lúc, chúng ta có thể sử dụng phương thức Object.getOwnPropertyDescriptors[obj].

Cùng với

let user = { };

Object.defineProperty[user, "name", {
  value: "John",
  // for new properties we need to explicitly list what's true
  enumerable: true,
  configurable: true
}];

alert[user.name]; // John
user.name = "Pete"; // Error
9nó, nó có thể được sử dụng như một cách nhân bản một cách nhận biết cờ:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
4

Thông thường khi chúng ta sao chép một đối tượng, chúng ta sử dụng một phép gán để sao chép các thuộc tính, như thế này:

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
5

Nhưng điều đó không sao chép cờ. Vì vậy, nếu chúng ta muốn có một bản sao tốt hơn, thì

let user = { };

Object.defineProperty[user, "name", {
  value: "John",
  // for new properties we need to explicitly list what's true
  enumerable: true,
  configurable: true
}];

alert[user.name]; // John
user.name = "Pete"; // Error
9được ưu tiên.

Một sự khác biệt khác là

let user = {
  name: "John"
};

Object.defineProperty[user, "name", {
  writable: false
}];

user.name = "Pete"; // Error: Cannot assign to read only property 'name'
1bỏ qua các thuộc tính tượng trưng, ​​nhưng
let user = {
  name: "John",
  toString[] {
    return this.name;
  }
};

// By default, both our properties are listed:
for [let key in user] alert[key]; // name, toString
2trả về tất cả các mô tả thuộc tính bao gồm các thuộc tính tượng trưng.

7. Niêm phong một đối tượng trên toàn cầuNiêm phong một đối tượng trên toàn cầu

Mô tả thuộc tính làm việc ở cấp độ của các thuộc tính cá nhân.

Ngoài ra còn có các phương thức giới hạn quyền truy cập vào toàn bộ đối tượng:

Object.preventExtensions[obj] Cấm bổ sung các thuộc tính mới cho đối tượng.

Object.seal[obj] Cấm thêm / loại bỏ các thuộc tính. Đặt

let user = { };

Object.defineProperty[user, "name", {
  value: "John",
  // for new properties we need to explicitly list what's true
  enumerable: true,
  configurable: true
}];

alert[user.name]; // John
user.name = "Pete"; // Error
8cho tất cả các thuộc tính hiện có.

Object.freeze[obj] Cấm thêm / xóa / thay đổi thuộc tính. Đặt

let user = {
  name: "John",
  toString[] {
    return this.name;
  }
};

// By default, both our properties are listed:
for [let key in user] alert[key]; // name, toString
4cho tất cả các thuộc tính hiện có.

Và cũng có những bài kiểm tra cho họ:

Object.isExtensible[obj] Trả về

let user = {};

Object.defineProperty[user, "name", {
  value: "John"
}];

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/*
{
  "value": "John",
  "writable": false,
  "enumerable": false,
  "configurable": false
}
 */
0nếu thêm thuộc tính bị cấm, nếu không
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
8. Object.isSealed[obj] Trả về
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
8nếu thêm / xóa thuộc tính bị cấm và tất cả các thuộc tính hiện có
let user = { };

Object.defineProperty[user, "name", {
  value: "John",
  // for new properties we need to explicitly list what's true
  enumerable: true,
  configurable: true
}];

alert[user.name]; // John
user.name = "Pete"; // Error
8.

Object.isFrozen[obj] Trả về

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: 
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/

let user = {
  name: "John"
};

let descriptor = Object.getOwnPropertyDescriptor[user, 'name'];

alert[ JSON.stringify[descriptor, null, 2 ] ];
/* property descriptor:
{
  "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true
}
*/
8nếu việc thêm / xóa / thay đổi thuộc tính bị cấm và tất cả các thuộc tính hiện tại là
let user = {
  name: "John",
  toString[] {
    return this.name;
  }
};

// By default, both our properties are listed:
for [let key in user] alert[key]; // name, toString
4.

Những phương pháp này hiếm khi được sử dụng trong thực tế.

Full series tự học Javascript từ cơ bản tới nâng cao tại đây nha.

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

  • Group Facebook
  • Fanpage
  • Youtube
  • Instagram
  • Twitter
  • Linkedin
  • Pinterest
  • Trang chủ

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!

Bài Viết Liên Quan

Chủ Đề