30/09/2018, 17:45

Javascript.OOP.Hỏi về Mẫu thừa kế chức năng (mẫu cho phép tạo với các thành phần riêng tư)

http://www.ibm.com/developerworks/vn/library/12/wa-protoop/
trong liệt kê thứ 16 của bài viết này có nói như về mẫu thừa kế chức năng,vì nhược điểm của nguyên mẫu và mẫu giả cổ điển ko cung cấp 1 thành phần riêng tư nào. Nhưng mình ko hiểu cái mẫu thừa kế chức năng này thành phần riêng tư nó là cái nào và hoạt động như thế nào. Giải thích mình với (các bạn vào link rồi đến phần liệt kê 16 để xem cho dễ
var point = function(spec) {
var that = {};

that.getTimesSet = function() {
    return timesSet;
};

that.getX = function() {
    return spec.x;
};

that.setX = function(val) {
    spec.x = val;
};

that.getY = function() {
    return spec.y;
};

that.setY = function(val) {
    spec.y = val;
};

return that;

};

var point3D = function(spec) {
var that = point(spec);

that.getZ = function() {
    return spec.z;
};

that.setZ = function(val) {
    spec.z = val;
};

return that;

};

var p = point({ x: 3, y: 4 });
p.getX(); // => 3
p.setX(5);

var p2 = point3D({ x: 1, y: 4, z: 2 });
p.getZ(); // => 2
p.setZ(3);

null viết 19:59 ngày 30/09/2018

Mình chép lại Liệt kê 16:

var point = function(spec) {
    var that = {};

    that.getTimesSet = function() {
        return timesSet;
    };

    that.getX = function() {
        return spec.x;
    };

    that.setX = function(val) {
        spec.x = val;
    };

    that.getY = function() {
        return spec.y;
    };

    that.setY = function(val) {
        spec.y = val;
    };

    return that;
};

var point3D = function(spec) {
    var that = point(spec);

    that.getZ = function() {
        return spec.z;
    };

    that.setZ = function(val) {
        spec.z = val;
    };

    return that;
};

Mẫu trên sẽ tạo ra 2 đối tượng pointpoint3D, trong đó point3D kế thừa 2 thành phần xy trong point, còn bản thân nó tạo ra thành phần z. Cả 3 thành phần này là riêng tư vì nó không thể truy cập và sửa đổi trực tiếp như trong Liệt kê 14, 15.

Hiện nay thì với chuẩn ES6, bạn có thể dùng class để tạo thành phần riêng tư như sau:

class point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
    set x(x) {
        this._x = x;
    }
    get x() {
        return this._x;
    }
    set y(y) {
        this._y = y;
    }
    get y() {
        return this._y;
    }
}

class point3D extends point {
    constructor(x, y, z) {
        super(x, y);
        this.z = z;
    }
    set z(z) {
        this._z = z;
    }
    get z() {
        return this._z;
    }
}

let p = new point3D(1, 2, 3);
p.x = 4; // setX = 4
p.x; // getX
Itachi Citus viết 19:47 ngày 30/09/2018

Sao cái hướng dẫn này có cảm giác dịch bằng google dịch thế nhỉ, đọc nhiều câu tối nghĩa

null viết 19:52 ngày 30/09/2018

Hình như có tình nguyện viên dịch, do chuyển hết các thuật ngữ Tiếng Anh sang Tiếng Việt nên đọc nhiều từ không quen.
Trên IBM cũng còn nhiều bài Tiếng Việt lắm, mà hầu hết là bài dịch.

Itachi Citus viết 19:47 ngày 30/09/2018

Nếu bạn đã dùng thử các ví dụ trên theo một ngôn ngữ có các đối tượng cổ điển, tĩnh (như mã Java), bạn sẽ phải sử dụng mẫu của trình trang trí, còn đòi hỏi nhiều chi phí hoạt động dựa trên khái niệm hơn và bạn vẫn không thể thừa kế trực tiếp từ đối tượng emmitt như là một cá thể. Ngược lại, mẫu các đặc tính được sử dụng trong các ngôn ngữ dựa trên nguyên mẫu như JavaScript cho phép bạn trang trí cho các đối tượng của mình theo một cách tự do hơn nhiều.

Có cảm giác người dịch không phải dân lập trình.

vũ xuân quân viết 19:45 ngày 30/09/2018

đọc đoạn đó thấy nhứt cả đầu.
tốt nhất coi tài liệu bằng tiếng anh.
không hiểu thì còn biết đường lên mạng tìm hiểu thêm.

Trương Phước Hiệu viết 20:01 ngày 30/09/2018

Thanks bạn. có đoạn “không thể truy cập và sửa đổi trực tiếp” thì mình mới hiểu được. Tối hôm qua cố gắng lên mạng tìm hiểu về OOP thì giờ mới hiểu được bạn nói gì chứ hôm qua thì chịu. Giờ 4 đặc tính của OOP giờ mình chỉ hiểu được tính kế thừa, sơ sơ bao đóng với đa hình chứ trừu tượng thì chịu. Trước giờ chưa làm bài tập nào về OOP toàn là đọc thôi, chắc sẽ tìm bài tập code nhiều về OOP mới hiểu hết được

Trương Phước Hiệu viết 19:51 ngày 30/09/2018

Mình thấy mấy bài trên IBM developerwork dễ hiểu mà bạn. Chắc do các bạn hiểu từ theo nghĩa hướng IT nên phạm vi từ nó bị thua hẹp lại nên khi dịch ra tiếng việt thì các bạn khó hiểu thôi. Do mình ko rành về OOP nên ngoài chỗ đó ra thì chỗ nào cũng ok hết. Khi đụng đến bất kì 1 từ tiếng anh nào ko biết hoặc đã biết nhưng nghĩa rộng thì mình toàn dùng oxford để xem nghĩa trừu tượng của nó rồi dùng từ hán việt để khái quát nó lại (lý do từ hán việt độ khái quát cao), nếu bi hán việt quá thì mới hiểu luôn bằng tiếng anh. Nên khi đọc chuyển đổi giữa anh và việt thì ok hết. 1 lợi ích nữa là khi đụng lại những từ kiểu đó ở bên ngoài hay những lĩnh vực khác thì do hiểu nghĩa trừu tượng được khái quát bằng hán việt nên cũng dễ hiểu hơn.

Itachi Citus viết 19:58 ngày 30/09/2018

Đoạn mình trích người ta dịch bị sai nghĩa đó bạn, bạn nên đọc tài liệu gốc tiếng Anh thì hơn. Ý của đoạn đó là các ngôn ngữ static như java để có thể làm được như js phải sử dụng mẫu thiết kế (design pattern) decorator, ở đây dịch là “mẫu của trình trang trí” dịch trắng nghĩa ra luôn.

Bài liên quan
0