+2

ES6

  1. Reflect Object trong ES6

Object Reflection là một ngôn ngữ cho phép kiểm tra và thao tác với các thuộc tính của object ở thời điểm runtime. JS đã hỗ trợ các APIs, nhưng các APIs này không được tổ chức dưới dạng một namespace, và các APIs này cũng đã bỏ qua khi thực thi hành động bị fail. Điều này làm cho khó khăn hơn khi viết các đoạn scripts liên quan đến reflect object.

ES2015 (ES6) giới thiệu đến chúng ta một object mới được gọi là Reflect, cung cấp những phép tham chiếu đến các object. Những phép tham chiếu này không đưa ra những trường hợp ngoại lệ hoặc là trả về lỗi, khi thất bại.Điều đó cho phép dễ dàng hơn khi viết code, khi không phải quan tâm đến trường hợp thất bại liên quan đến tham chiếu một đối tượng.

The Reflect:

Không phải là một kiểu constructor, có thể khởi tạo nên một đối tượng hoàn toàn mới. Reflect chỉ là một object thuần, trình bày các methods để tham chiếu các thuộc tính của object đó.

Reflect có tổng cộng 14 cách tham chiếu đến object.

Không dài dòng nữa, chúng ta sẽ cùng đi vào tìm hiểu các methods này ngay bây giờ

1.1. Reflect.get(object, property[, this])

Reflect.get được sử dụng để tương tác(get) với một giá trị của thuộc tính đối tượng. Với tham số đầu tiên tham chiếu tới object, tham số thứ 2 là tên của thuộc tính. Nếu chúng ta tương tác với giá trị của một thuộc tính, chúng ta có thể cung cấp tham số thứ 3 là this bên trong hàm get. Dưới đây là code demo cho Reflect.get:

const obj = { name: "viblo" };

const name = Reflect.get(obj, "name");

console.log(name); // In ra: "viblo"

Method get cũng khá là quen thuộc đối với các bạn đã code java hoặc một số ngôn ngữ có cách gọi thuộc tính bằng dấu . và dấu (). Theo cách này, ta cũng có thể truyền giá trị vào cho 1 thuộc tính của object. Tuy nhiên, có một cách tiện lợi hơn, giống như một số ngôn ngữ như java cũng đã dùng, phương thức set.

Dưới đây là code demo của Reflect.set:

var obj = { name: "" };

Reflect.set(obj, "name", "Frg VN");

console.log(obj.name); // In ra: "Frg VN"

Sau đây, tôi sẽ lần lượt giới thiệu các methods khác của Reflect.

Reflect.defineProperty(object, property, descriptor)

Reflect.defineProperty được sử dụng để định nghĩa một thuộc tính của object. Nó giống như việc ta sử dụng Object.defineProperty.

Sau đây, là một đoạn ví dụ cho cách sử dụng Object.defineProperty:

var obj = {};

Reflect.defineProperty(obj, "name", {value: "Frg VN"});

console.log(obj.name); //Output "Frg VN"

Reflect.deleteProperty(object, property)

Tương tự, nhưng với chức năng trái ngược, Reflect.deleteProperty(object, property) dùng để delete một thuộc tính của object. Với tham số đầu tiên là object trỏ đến, tham số thứ hai là thuộc tính muốn xóa.

Đoạn code ví dụ sẽ minh họa cho chức năng này:

var obj = { name: "ES6 qua kho" };

Reflect.deleteProperty(obj, "name");

console.log(obj.name); //Output "undefined"

Sau khi chạy dòng lệnh Reflect.deleteProperty(obj, "name") thì thuộc tính name đã bị xóa, khi gọi qua console.log() đã không còn.

Reflect.has(object, property)

Ta dùng hàm này để kiểm tra xem một thuộc tính có trong một object hay không, đúng như ý nghĩa tên gọi của nó. Chúng ta hãy xem qua một đoạn code đơn giản, để xem function này hoạt động ra sao:

ar obj = { name: "Frg Vn" };

console.log(Reflect.has(obj, "name")); //Output "true"

console.log(Reflect.has(obj, "age")); // Output "false"

Reflect.getOwnPropertyDescriptor(object, property)

Phương thức này cho phép mô tả về một thuộc tính của object, có thể show ra các đặc tính chi tiết, các trường của thuộc tính đó.

Tham số đầu tiên object chính là object cần trỏ đến, tham số thứ hai property chính là tên thuộc tính muốn truy cập.

var obj = { name: "Frg VN" };

var descriptor = Reflect.getOwnPropertyDescriptor(obj, "name");

console.log(descriptor);

Output sẽ có dạng

Object { value: "Frg VN", writable: true, enumerable: true, configurable: true }

Reflect.ownKeys(object)

Phương thức trả về một mảng các giá trị biểu diễn các keys của các thuộc tính của object.

ví dụ:

var obj = {name: "Frg VN", title: "company", __proto__: {author: "ABC san"}};

var keys = Reflect.ownKeys(obj);

console.log(keys);

Ta sẽ thu được kết quả Output:

["name", "title"]

Reflect.preventExtensions(object)

sử dụng để đánh dấu, hoặc quy định những object ko thể extension, tức là không thể định nghĩa thêm thuộc tính cho object đó.

Tôi sẽ minh họa cho tác dụng của method này qua đoạn code:

var obj = {};

Reflect.preventExtensions(obj);

obj.name = "over9";

console.log(obj.name); //Output "undefined"

Reflect.isExtensible(object)

sử dụng để kiểm tra xem object có khả năng extension hay không.

Các bạn cùng theo dõi đoạn code:

var obj = {};

Reflect.preventExtensions(obj);

console.log(Reflect.isExtensible(obj)); //Output "false"

trong đoạn code trên, phương thức Reflect.preventExtensions(obj) đã thực hiện và tác dụng của nó là ko cho object obj có khả năng extension. Do đó, kêt quả Output là : "false".

Reflect.setPrototypeOf(object, prototype)

phương thức này để set các thuộc tính của một object. Tham số đầu tiên là object muốn set, tham số thứ hai là tên thuộc tính, có thể null hoặc là một object. Ví dụ sau đây sẽ minh chứng cho điều đó

var obj = {};

Reflect.setPrototypeOf(obj, {name: "Frg VN"});

console.log(obj.name); //Output "Frg VN"

Reflect.getPrototypeOf(object)

Cặp đôi quen thuộc khi tương tác với một objectsetget. chính vì thế, phương thức trên trả về các giá trị với các keys của object đó.

var obj = {};

Reflect.setPrototypeOf(obj, { name: "Frg VN", Floor: "13" });

console.log(Reflect.getPrototypeOf(obj));
// Output: Object { name: "Frg VN", Floor: "13" }

Reflect.enumerate(object)

phương thức sẽ lấy gọi đối tượng, trả về chỉ số object và chứa các chỉ số tuần tự trong object đó. Nó cũng trả về các chỉ số kế thừa của một object.

Nếu bạn vẫn chưa thể hình dung ra, hãy đọc đoạn code dưới đây để có thể hiểu rõ hơn:

var obj = {copany: "Frg VN", profession: "developer"};

var iterator = Reflect.enumerate(obj);

console.log(iterator.next().value);
console.log(iterator.next().value);
console.log(iterator.next().done);

Output:

copany
profession
true

Reflect.apply(function[, this, args])

phương thức này dùng để gọi một function thực thi với nhận một giá trị là this, với tham số thứ nhất là tên function, tham số thứ 2 là các giá trị đối số của function đó.

Như thường lệ sẽ là đoạn code minh họa để bạn có thể hiểu hơn:

function sum(x, y)
{
    return this + x + y;
}

var value = Reflect.apply(sum, 30, [10, 20]);

console.log(value); //Output "60"

Reflect.construct(constructor[, args, prototype])

như tên của phương thức, nó hoạt động như một constructor. Tham số thứ nhất là function tham chiếu, tham số thứ hai là một mảng các giá trị được truyền vào như là các đối số, và tham số thứ 3 là một constructor khác mà sử dụng prototype hiện tại để gọi constructor.

Cách hoạt động nếu bạn để ý một chút sẽ dễ dàng nắm được:

function constructor1(a, b)
{
    this.a = a;
    this.b = b;
    this.f = function(){
        return this.a + this.b + this.c;
    }
}

function constructor2(){}
constructor2.prototype.c = 30;

var obj = Reflect.construct(constructor1, [10, 20], constructor2);

console.log(obj.f()); //Output "60"

Trên đây, tôi đã giới thiệu đến các bạn những phương thức của Reflect.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí