Mã Javascript đơn giản để hiểu cơ bản về OOP dựa trên nguyên mẫu [đã đóng]


8

Tôi biết Javascript một thời gian, mặc dù tôi không phải là người dùng nặng, nhưng tôi biết nó là lần đầu tiên kể từ khi Netscape là trình duyệt của tôi. Tôi khá hiểu những điều chính, nhưng vì cách tiếp cận JavaScript với OOP là nguyên mẫu nên tôi có một số vấn đề khi nắm bắt nó.

Một vấn đề cần nói thêm là dường như mọi thứ có thể được thực hiện theo nhiều cách, và đây là nơi sách không giúp được gì nhiều vì chúng đặt tất cả các ví dụ trên bàn khiến bạn khó theo kịp tốc độ.

Những gì tôi cần để bắt đầu chỉ là một cách để làm điều đó, nếu ai đó có thể giúp tôi với mã đơn giản nhất có thể là một ví dụ mà tôi có thể thấy mô hình OOP nguyên mẫu hoạt động như thế nào?

Để hữu ích, mã phải có một đối tượng được kế thừa, để truy cập vào thuộc tính của cha mẹ và các thuộc tính được kế thừa của nó và chức năng của cha mẹ, để ghi đè chức năng của cha mẹ và có một thể hiện của một thừa kế trong đó một đối tượng thừa hưởng hai đối tượng khác.


Xin chào và một chút muộn màng Chào mừng các lập trình viên. Thật không may, câu hỏi này rõ ràng là 5 câu hỏi và một số câu hỏi ngầm khác. Điều này làm cho nó rất không tập trung và nó có thể sẽ bị đóng lại. Nếu bạn có thể tập trung vào câu hỏi của mình, điều đó có thể khiến nó trở nên dễ chấp nhận hơn đối với các nguyên tắc của trang web. Có một ngày dễ chịu.
Kỹ sư thế giới

@WorldEngineer Tôi đoán bằng ngôn ngữ khác, hầu hết các câu trả lời cho 5 câu hỏi đúng giờ có thể được đưa ra trong một hoặc một vài dòng. Thật không may, tôi không thể tách tất cả 5 câu hỏi và hỏi từng người một, hoặc tôi có thể? Điều này có được phép không?
Eduard Florinescu

1
Vui lòng hỏi một câu hỏi tại một thời điểm và nếu sau đó bạn có thêm câu hỏi, hãy hỏi chúng dưới dạng câu hỏi riêng biệt nhưng được liên kết.
ChrisF

1
@WorldEngineer Tôi đã chỉnh sửa câu hỏi thành duy nhất
Eduard Florinescu

1
BTW, một điều thừa kế cổ điển đã sai là các phương thức và thuộc tính hoàn toàn riêng biệt, trên một máy kiến ​​trúc Neumann (ARM, PowerPC, Intel), thật vô nghĩa. Đây là điều mà JS làm tốt. Và đây là những câu hỏi rất hay để minh họa cách thức hoạt động của proto-oop.
Aadaam

Câu trả lời:


6

Làm thế nào có thể được thừa kế một đối tượng?

function inherit(o){ // inherit is called Object.create in modern implementations
    var F= function(){};
    F.prototype=o;
    return new F();
}

var parent = {
    name: "Josh",
    print: function(){
       console.log("Hello, "+this.name);
    }
};
parent.print(); // Hello, Josh
var child = inherit(parent);
child.name = "Jeremy";
parent.print(); //Hello, Josh
child.print();  //Hello, Jeremy

Làm thế nào tôi có thể thấy tài sản của cha mẹ?

console.log(child.__proto__.name); //won't work in IE; also see getPrototypeOf

Làm thế nào tôi có thể truy cập chức năng của cha mẹ?

Object.getPrototyepeOf(child).print(); // or
child.print.apply(parent) //functions are just objects, and 'this' pointer can point to wherever you want

Làm thế nào tôi có thể ghi đè chức năng của cha mẹ?

child.print = function(){
    console.log("Hi ", this.name);
}

parent.print(); //Hello, Josh
child.print();  //Hi, Jeremy

Làm thế nào một đối tượng có thể thừa hưởng hai đối tượng?

//in chain?

grandchild = inherit(child);

//otherwise, there's no way.
grandchild.name = "Eddie";
grandchild.print();

Cũng thấy:


Tôi đã chỉnh sửa vì hàm F không có {} và đối tượng có; (dấu chấm phẩy) thay vì, (dấu phẩy) bây giờ nó không đưa ra bất kỳ lỗi nào trong bảng điều khiển. Nó hoạt động và tôi không biết tại sao bây giờ nó có vẻ đơn giản như vậy. Một trong những đồng nghiệp của tôi cũng có Phần tốt, nhưng trong trường hợp này, ví dụ của bạn đã giúp nhiều hơn. Cảm ơn.
Eduard Florinescu

2

Chuyên gia vui nhộn @venkat_s chia sẻ một sự tương tự để nắm bắt sự kế thừa nguyên mẫu.

Đây là một ví dụ về sự hài hước của anh ấy, "Điều về JavaScript là, nó không mắng bạn. Đó là bạn của bạn. Nó sẽ không cho bạn biết khi có điều gì đó không ổn, nó sẽ ngừng hoạt động. Hãy ngừng gọi cho bạn"

Để kế thừa, ông nói tiếp: "Nguyên mẫu giống như một chiếc ba lô - đối với vật thể. Đối với mọi thứ trong JavaScript là một vật thể - nó có một chiếc ba lô và bạn có thể đặt đồ đạc vào đó. Và tất cả các đối tượng của bạn đều có thể truy cập nó."

Mong rằng sẽ giúp.


Tôi cho rằng ba lô là nguyên mẫu?
Eduard Florinescu

Vâng, xin lỗi cho sự ngắn gọn. Anh ấy tiếp tục mở rộng sự tương tự sang đa thừa kế - "Nó giống như có một chiếc ba lô và ví tiền.", "Bạn chỉ cần đặt mọi thứ vào mỗi thứ.", "Đôi khi lỗi với thừa kế nguyên mẫu là ... bạn có thể mất ví của bạn và bạn phải lấy lại. " Đây là thách thức mà bạn có thể gặp phải, nhưng là mẫu thiết kế oo cơ bản để giải quyết.
Jack Stone

2

Quên mã. Giải thích đơn giản nhất.

Hàm xây dựng hàm xây dựng đối tượng. Trong JS, các hàm là các đối tượng có thể có các thuộc tính. Mỗi hàm có một thuộc tính nguyên mẫu có thể chứa bất kỳ đối tượng nào. Bạn có thể thiết lập bất kỳ nguyên mẫu xây dựng nào một cách dễ dàng. Nếu bạn muốn làm hỏng mảng chẳng hạn,

Array.prototype = {
    oneTrueMethodToRuleThemAll: function(){
        alert('arrays are now hosed');
    }
}

Đối tượng nguyên mẫu về cơ bản là một dự phòng được kiểm tra bởi các trường hợp khi bạn cố gắng tham chiếu một thuộc tính mà họ không có. Nếu đối tượng nguyên mẫu không có phương thức đó, đối tượng nguyên mẫu của hàm tạo sẽ được kiểm tra phương thức đó. Đó là chuỗi được theo dõi.

Vì vậy, nó không thực sự về thừa kế. Đó là về, "Ồ, bạn không có cái đó, mẹ bạn có để nó trong túi nguyên mẫu không? Không? Bà của bạn thì sao? Không? Vậy thì .. cho đến khi chúng ta đến với Eve, hay nguyên mẫu của nhà xây dựng Object. là nơi buck luôn dừng lại.

Vì vậy, nó không phải là trường hợp của bạn nhận hoặc giữ lại những thứ trong nguyên mẫu. Chỉ là khi JavaScript gọi một phương thức của một đối tượng thì có quá trình dự phòng để kiểm tra chuỗi object-> constructor.prototype để xem có thể tìm thấy phương thức chưa biết hay không. Và đó là lý do tại sao khi bạn thay đổi một nguyên mẫu hàm tạo, tất cả các trường hợp hiện có "lấy" phương thức đó. Họ không thực sự nhận được bất cứ điều gì cả. Đó là bộ dự phòng của họ để tìm kiếm phương thức mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.